/* * This is a cellular automaton library * * Copyright (C) 2016-2017 Antoine BARTUCCIO, Jean POREE DE RIDDER * * Licensed under the MIT License,(the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * hhttps://opensource.org/licenses/MIT * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * */ #ifndef CELLELMNT_H #define CELLELMNT_H /** * An essential basic type, added an ERROR for out of bounds * * @param true 1 * @param false 0 * @param ERROR -1 * */ typedef enum Bool{ true = 1, false = 0, ERROR = -1 } bool; /** * A cell of the matrix * * @param colIndex is index (int) of the column of this cell * @param rowIndex is index (int) of the row of this cell * * @param nextCol is pointer on the next cellElement in the same column * @param nextRow is pointer on the next cellElement in the same row * * @see CreateCellElem to allocate one and FreeCellElement to free one */ struct cellElement { int colIndex; int rowIndex; struct cellElement * nextCol; struct cellElement * nextRow; }; typedef struct cellElement cellElement; /** * Allocates a cellElement and returns it * * @return pointer on the allocated cellElement * */ cellElement * CreateCellElem(); /** * Allocates a cellElement and sets it as the NextCol of the tree * * @param tree is a pointer on an allocated cellElement * * @return int error codes * */ int AddNextCol(cellElement* tree); /** * Allocates a cellElement and sets it as the NextRow of the tree * * @param tree is a pointer on an allocated cellElement * * @return int error codes * */ int AddNextRow(cellElement* tree); /** * Free the nextCol cellElement of the tree * * @param tree is a pointer on an allocated cellElement * @return void * */ void removeNextCol(cellElement* tree); /** * Free the nextRow cellElement of the tree * * @param tree is a pointer on an allocated cellElement * @return void * */ void removeNextRow(cellElement* tree); /** * Frees a cellElement and returns it * * @param element is pointer on the allocated cellElement * @return void * */ void FreeCellElement(cellElement* element); /** * Checks is the tree is a leaf * * @param tree is a pointer on an allocated cellElement * * @return a bool (true/false) * */ bool is_leaf(cellElement* tree); /** * Allows you to set the colIndex and the rowIndex of the cellElement elem * * @param elem is a pointer on an allocated cellElement * @param Col is the value for colIndex * @param Row is the value for rowIndex * * @return int error codes * */ int SetPositionIndex(cellElement* elem,int Col,int Row); /** * Allows you to set the nextCol of the cellElement tree * * @param tree is a pointer on the element you want to set * @param elem is a pointer on a cellElement * * @return int error codes * */ int SetNextCol(cellElement* tree,cellElement* elem); /** * Allows you to set the nextRow of the cellElement elem * * @param tree is a pointer on the element you want to set * @param elem is a pointer on a cellElement * * @return int error codes * */ int SetNextRow(cellElement* tree,cellElement* elem); /** * A debug function that recursively prints a tree, don't use it in not tree structured cellElements (may cause endless loops) * * @param tree a pointer on a cell element * * @return void */ void recursivePrint(cellElement * tree); /** * Apply OR operator to a bool a and a bool b* * * @param a a bool * @param b a bool * * @return result a or b */ bool OR(bool a, bool b); /** * Apply AND operator to a bool a and a bool b * * @param a a bool * @param b a bool * * @return result a and b */ bool AND(bool a, bool b); /** * Apply XOR operator to a bool a and a bool b * * @param a a bool * @param b a bool * * @return result a and b */ bool XOR(bool a, bool b); /** * Return false if the bool is ERROR * * @param x a bool * * @return result a bool */ bool ErrorToFalse(bool x); #endif