#ifndef _OTB_TRISKELE_ARRAY_TREE_BUILDER_HPP #define _OTB_TRISKELE_ARRAY_TREE_BUILDER_HPP #ifdef ENABLE_LOG #include #endif // ENABLE_LOG #include #include "triskeleBase.hpp" #include "triskeleDebug.hpp" #include "triskeleSort.hpp" #include "triskeleDealThreads.hpp" #include "TreeBuilder.hpp" #include "Attributes/WeightAttributes.hpp" #include "AttributeProfiles.hpp" #include "IImage.hpp" #include "GraphWalker.hpp" #include "Weight.hpp" #include "Leader.hpp" namespace otb { namespace triskele { namespace arrayTree { template class ArrayTreeBuilder : public TreeBuilder { protected: unsigned int coreCount; const Raster &raster; const GraphWalker &graphWalker; TreeType treeType; bool countingFlag; Leader leaders; // transcient DimNodeId *childCount; DimImg *newCompId; WeightT *compWeights; public: inline ArrayTreeBuilder (Raster &raster, const GraphWalker &graphWalker, const TreeType &treeType, const bool &countingSort = true); inline ~ArrayTreeBuilder (); inline void buildTree (Tree &tree, WeightAttributes &weightAttributes); inline void setAttributProfiles (AttributeProfiles &attributeProfiles); protected: template inline void buildTree (Tree &tree, const WeightFunct &weightFunct); template inline void setAttributProfiles (AttributeProfiles &attributeProfiles, const WeightFunct &weightFunct); template inline void buildParents (Edge *edges, const WeightFunct &weightFunct, const Rect &tile, DimImg &topParent); template inline void connectLeaf (DimImg a, DimImg b, const WeightT &weight, DimImg &parCount, const WeightFunct &weightFunct); inline void unlinkParent (const DimImg &par); template inline void connect3Comp (DimImg newComp, DimImg topA, DimImg topB, const WeightFunct &weightFunct); template inline void connectComp (DimImg topA, DimImg topB, const WeightFunct &weightFunct); template inline DimImg updateNewId (const vector &compBases, const vector &compTops, const WeightFunct &weightFunct); inline void updateNewId (const DimImg curComp, DimImg &compCount); inline void compress (const DimImg &compTop); inline DimImg createParent (DimImg &topParent, const WeightT &weight, DimImg &childA, DimImg &childB); inline void addChild (const DimImg &parent, DimImg &child); inline void addChildren (const DimImg &parent, const DimImg &sibling); inline DimImg findRoot (DimImg comp); template inline DimImg findTopComp (const DimImg &comp, const WeightFunct &weightFunct); template inline DimImg findTopComp (DimImg comp, const WeightT &weight, const WeightFunct &weightFunct); inline DimImg findNotLonelyTop (DimImg comp); inline DimImg findMultiChildrenTop (DimImg comp); inline void buildChildren (); // nice ostream struct CPrintComp { const ArrayTreeBuilder &atb; const DimImg &compId; inline CPrintComp (const ArrayTreeBuilder &atb, const DimImg &compId); inline ostream &print (ostream &out) const; }; inline CPrintComp printComp (const DimImg &compId) const { return CPrintComp (*this, compId); } friend inline ostream &operator << (ostream& out, const CPrintComp &lc) { return lc.print (out); } }; #include "ArrayTreeBuilder.tpp" } // arrayTree } // triskele } // otb #endif // _OTB_TRISKELE_ARRAY_TREE_BUILDER_HPP