From e2fc1ed91c5b7c560fef8717d369697fcf979a69 Mon Sep 17 00:00:00 2001 From: Sylvain Thery Date: Wed, 14 Mar 2012 16:27:52 +0100 Subject: [PATCH] add copyFrom method in genericmap (testing in progress) add some const --- include/Container/attributeContainer.h | 7 +++ include/Container/attributeMultiVector.h | 4 ++ include/Container/attributeMultiVector.hpp | 10 +++- include/Container/holeblockref.h | 11 ++++- include/Topology/generic/genericmap.h | 7 ++- include/Topology/gmap/gmap0.h | 2 +- include/Topology/gmap/gmap0.hpp | 2 +- include/Topology/gmap/gmap1.h | 2 +- include/Topology/gmap/gmap1.hpp | 2 +- include/Topology/gmap/gmap2.h | 2 +- include/Topology/gmap/gmap2.hpp | 2 +- include/Topology/gmap/gmap3.h | 2 +- include/Topology/gmap/gmap3.hpp | 2 +- include/Topology/map/map1.h | 2 +- include/Topology/map/map1.hpp | 2 +- include/Topology/map/map2.h | 2 +- include/Topology/map/map2.hpp | 2 +- include/Topology/map/map3.h | 2 +- include/Topology/map/map3.hpp | 2 +- src/Container/attributeContainer.cpp | 53 ++++++++++++++++++++++ src/Container/holeblockref.cpp | 16 ++++++- 21 files changed, 117 insertions(+), 19 deletions(-) diff --git a/include/Container/attributeContainer.h b/include/Container/attributeContainer.h index 2f3adb56..a4acb3e6 100644 --- a/include/Container/attributeContainer.h +++ b/include/Container/attributeContainer.h @@ -530,6 +530,13 @@ public: * @param id ?? */ bool loadBin(CGoGNistream& fs); + + /** + * copy container + * TODO a version that compact on the fly ? + */ + void copyFrom(const AttributeContainer& cont); + }; } // namespace CGoGN diff --git a/include/Container/attributeMultiVector.h b/include/Container/attributeMultiVector.h index 54c4593f..4d842466 100644 --- a/include/Container/attributeMultiVector.h +++ b/include/Container/attributeMultiVector.h @@ -126,6 +126,8 @@ public: */ virtual void setNbBlocks(unsigned int nbb) = 0; + virtual unsigned int getNbBlocks() const = 0; + virtual void addBlocksBefore(unsigned int nbb) = 0; virtual bool copy(const AttributeMultiVectorGen* atmvg) = 0; @@ -244,6 +246,8 @@ public: void setNbBlocks(unsigned int nbb); + unsigned int getNbBlocks() const; + void addBlocksBefore(unsigned int nbb); bool copy(const AttributeMultiVectorGen* atmvg); diff --git a/include/Container/attributeMultiVector.hpp b/include/Container/attributeMultiVector.hpp index f6d4502c..8668aac8 100644 --- a/include/Container/attributeMultiVector.hpp +++ b/include/Container/attributeMultiVector.hpp @@ -132,7 +132,9 @@ AttributeMultiVector::~AttributeMultiVector() template inline AttributeMultiVectorGen* AttributeMultiVector::new_obj() { - return new AttributeMultiVector; + AttributeMultiVectorGen* ptr = new AttributeMultiVector; + ptr->setTypeName(m_typeName); + return ptr; } /************************************** @@ -166,6 +168,12 @@ void AttributeMultiVector::setNbBlocks(unsigned int nbb) } } +template +unsigned int AttributeMultiVector::getNbBlocks() const +{ + return m_tableData.size(); +} + template void AttributeMultiVector::addBlocksBefore(unsigned int nbb) { diff --git a/include/Container/holeblockref.h b/include/Container/holeblockref.h index dc85a78e..0489842f 100644 --- a/include/Container/holeblockref.h +++ b/include/Container/holeblockref.h @@ -27,6 +27,7 @@ #include #include +#include #include "Container/sizeblock.h" @@ -49,7 +50,7 @@ protected: unsigned int m_nbref; /** - * nb element in block + * nb elements in block */ unsigned int m_nb; @@ -59,6 +60,11 @@ public: */ HoleBlockRef(); + /** + * copy constructor + */ + HoleBlockRef(const HoleBlockRef& hb); + /** * destructor */ @@ -149,6 +155,7 @@ public: */ inline bool unref(unsigned int i) { +// assert(m_refCount[i] > 1); m_refCount[i]--; if (m_refCount[i] == 1) { @@ -165,7 +172,7 @@ public: /** * number of references of element i - * @return the number of references (0 = no elements) + * @return the number of references +1 (stored as n+1, 0 = not used, 1 used but not refs, ...) */ inline unsigned int nbRefs(unsigned int i) { return m_refCount[i]; } diff --git a/include/Topology/generic/genericmap.h b/include/Topology/generic/genericmap.h index 07044134..b1ce0587 100644 --- a/include/Topology/generic/genericmap.h +++ b/include/Topology/generic/genericmap.h @@ -150,7 +150,7 @@ public: ~GenericMap() ; - virtual std::string mapTypeName() = 0 ; + virtual std::string mapTypeName() const = 0 ; /** * Clear the map @@ -503,6 +503,11 @@ public: */ bool loadMapBin(const std::string& filename) ; + /** + * copy from another map (of same type) + */ + bool copyFrom(const GenericMap& map); + /** * Dump attributes types and names per orbit */ diff --git a/include/Topology/gmap/gmap0.h b/include/Topology/gmap/gmap0.h index 22895d14..1134f84d 100644 --- a/include/Topology/gmap/gmap0.h +++ b/include/Topology/gmap/gmap0.h @@ -46,7 +46,7 @@ protected: public: GMap0(); - virtual std::string mapTypeName(); + virtual std::string mapTypeName() const; virtual unsigned int dimension(); diff --git a/include/Topology/gmap/gmap0.hpp b/include/Topology/gmap/gmap0.hpp index d10da628..d1e83947 100644 --- a/include/Topology/gmap/gmap0.hpp +++ b/include/Topology/gmap/gmap0.hpp @@ -37,7 +37,7 @@ inline GMap0::GMap0() : AttribMap() init() ; } -inline std::string GMap0::mapTypeName() +inline std::string GMap0::mapTypeName() const { return "GMap0"; } diff --git a/include/Topology/gmap/gmap1.h b/include/Topology/gmap/gmap1.h index 961007f5..1a7ef86b 100644 --- a/include/Topology/gmap/gmap1.h +++ b/include/Topology/gmap/gmap1.h @@ -45,7 +45,7 @@ public: GMap1(); - virtual std::string mapTypeName(); + virtual std::string mapTypeName() const; virtual unsigned int dimension(); diff --git a/include/Topology/gmap/gmap1.hpp b/include/Topology/gmap/gmap1.hpp index 32ca4d1d..65fe2434 100644 --- a/include/Topology/gmap/gmap1.hpp +++ b/include/Topology/gmap/gmap1.hpp @@ -35,7 +35,7 @@ inline GMap1::GMap1() : GMap0() init() ; } -inline std::string GMap1::mapTypeName() +inline std::string GMap1::mapTypeName() const { return "GMap1"; } diff --git a/include/Topology/gmap/gmap2.h b/include/Topology/gmap/gmap2.h index 341ca757..d2b09be2 100644 --- a/include/Topology/gmap/gmap2.h +++ b/include/Topology/gmap/gmap2.h @@ -50,7 +50,7 @@ public: GMap2(); - virtual std::string mapTypeName(); + virtual std::string mapTypeName() const; virtual unsigned int dimension(); diff --git a/include/Topology/gmap/gmap2.hpp b/include/Topology/gmap/gmap2.hpp index f35c1134..e31d9619 100644 --- a/include/Topology/gmap/gmap2.hpp +++ b/include/Topology/gmap/gmap2.hpp @@ -35,7 +35,7 @@ inline GMap2::GMap2() : GMap1() init() ; } -inline std::string GMap2::mapTypeName() +inline std::string GMap2::mapTypeName() const { return "GMap2"; } diff --git a/include/Topology/gmap/gmap3.h b/include/Topology/gmap/gmap3.h index cd82a326..3de5c92b 100644 --- a/include/Topology/gmap/gmap3.h +++ b/include/Topology/gmap/gmap3.h @@ -55,7 +55,7 @@ public: GMap3(); - virtual std::string mapTypeName(); + virtual std::string mapTypeName() const; virtual unsigned int dimension(); diff --git a/include/Topology/gmap/gmap3.hpp b/include/Topology/gmap/gmap3.hpp index d25d431e..90a70433 100644 --- a/include/Topology/gmap/gmap3.hpp +++ b/include/Topology/gmap/gmap3.hpp @@ -35,7 +35,7 @@ inline GMap3::GMap3() : GMap2() init() ; } -inline std::string GMap3::mapTypeName() +inline std::string GMap3::mapTypeName() const { return "GMap3"; } diff --git a/include/Topology/map/map1.h b/include/Topology/map/map1.h index f1f5ccd8..a4ab0724 100644 --- a/include/Topology/map/map1.h +++ b/include/Topology/map/map1.h @@ -51,7 +51,7 @@ protected: public: Map1(); - virtual std::string mapTypeName(); + virtual std::string mapTypeName() const; virtual unsigned int dimension(); diff --git a/include/Topology/map/map1.hpp b/include/Topology/map/map1.hpp index 2643f76b..5f1b93f3 100644 --- a/include/Topology/map/map1.hpp +++ b/include/Topology/map/map1.hpp @@ -38,7 +38,7 @@ inline Map1::Map1() : AttribMap() init() ; } -inline std::string Map1::mapTypeName() +inline std::string Map1::mapTypeName() const { return "Map1" ; } diff --git a/include/Topology/map/map2.h b/include/Topology/map/map2.h index dbee2199..828194a7 100644 --- a/include/Topology/map/map2.h +++ b/include/Topology/map/map2.h @@ -62,7 +62,7 @@ public: Map2(); - virtual std::string mapTypeName(); + virtual std::string mapTypeName() const; virtual unsigned int dimension(); diff --git a/include/Topology/map/map2.hpp b/include/Topology/map/map2.hpp index 5689d499..9b9ecd13 100644 --- a/include/Topology/map/map2.hpp +++ b/include/Topology/map/map2.hpp @@ -37,7 +37,7 @@ inline Map2::Map2() : Map1() init() ; } -inline std::string Map2::mapTypeName() +inline std::string Map2::mapTypeName() const { return "Map2" ; } diff --git a/include/Topology/map/map3.h b/include/Topology/map/map3.h index e1cd7af8..01c135fc 100644 --- a/include/Topology/map/map3.h +++ b/include/Topology/map/map3.h @@ -69,7 +69,7 @@ public: Map3(); - virtual std::string mapTypeName(); + virtual std::string mapTypeName() const; virtual unsigned int dimension(); diff --git a/include/Topology/map/map3.hpp b/include/Topology/map/map3.hpp index c018718e..efcceb55 100644 --- a/include/Topology/map/map3.hpp +++ b/include/Topology/map/map3.hpp @@ -35,7 +35,7 @@ inline Map3::Map3() : Map2() init() ; } -inline std::string Map3::mapTypeName() +inline std::string Map3::mapTypeName() const { return "Map3"; } diff --git a/src/Container/attributeContainer.cpp b/src/Container/attributeContainer.cpp index db784d42..c80fabb9 100644 --- a/src/Container/attributeContainer.cpp +++ b/src/Container/attributeContainer.cpp @@ -690,4 +690,57 @@ bool AttributeContainer::loadBin(CGoGNistream& fs) return true; } + +void AttributeContainer::copyFrom(const AttributeContainer& cont) +{ +// clear is done from the map + + m_size = cont.m_size; + m_maxSize = cont.m_maxSize; + m_orbit = cont.m_orbit; + m_nbUnknown = cont.m_nbUnknown; + m_nbAttributes = cont.m_nbAttributes; + m_lineCost = cont.m_lineCost; + + // blocks + unsigned int sz = cont.m_holesBlocks.size(); + m_holesBlocks.resize(sz); + for (unsigned int i = 0; i < sz; ++i) + m_holesBlocks[i] = new HoleBlockRef(*(cont.m_holesBlocks[i])); + + // blocks with free + sz = cont.m_tableBlocksWithFree.size(); + m_tableBlocksWithFree.resize(sz); + for (unsigned int i = 0; i < sz; ++i) + m_tableBlocksWithFree[i] = cont.m_tableBlocksWithFree[i]; + + // empty blocks + sz = cont.m_tableBlocksEmpty.size(); + m_tableBlocksEmpty.resize(sz); + for (unsigned int i = 0; i < sz; ++i) + m_tableBlocksEmpty[i] = cont.m_tableBlocksEmpty[i]; + + //attributes (warning attribute can have different numbers than in original) + m_tableAttribs.reserve(m_nbAttributes); + sz = cont.m_tableAttribs.size(); + for (unsigned int i = 0; i < sz; ++i) + { + if (cont.m_tableAttribs[i] != NULL) + { + AttributeMultiVectorGen* ptr = cont.m_tableAttribs[i]->new_obj(); + ptr->setName(cont.m_tableAttribs[i]->getName()); + ptr->setOrbit(cont.m_tableAttribs[i]->getIndex()); + ptr->setIndex(m_tableAttribs.size()); + ptr->setNbBlocks(cont.m_tableAttribs[i]->getNbBlocks()); + ptr->copy(cont.m_tableAttribs[i]); + if (cont.m_tableAttribs[i]->toProcess()) + ptr->toggleProcess(); + else + ptr->toggleNoProcess(); + m_tableAttribs.push_back(ptr); + } + } +} + + } diff --git a/src/Container/holeblockref.cpp b/src/Container/holeblockref.cpp index f353948c..677f300c 100644 --- a/src/Container/holeblockref.cpp +++ b/src/Container/holeblockref.cpp @@ -43,10 +43,24 @@ namespace CGoGN HoleBlockRef::HoleBlockRef(): m_nbfree(0),m_nbref(0),m_nb(0) { - m_tableFree = new unsigned int[_BLOCKSIZE_]; + m_tableFree = new unsigned int[_BLOCKSIZE_ + 10]; m_refCount = new unsigned int[_BLOCKSIZE_]; } +HoleBlockRef::HoleBlockRef(const HoleBlockRef& hb) +{ + m_nbfree = hb.m_nbfree; + m_nbref = hb.m_nbref; + m_nb = hb.m_nb; + + m_tableFree = new unsigned int[_BLOCKSIZE_ +10]; + memcpy(m_tableFree, hb.m_tableFree, (_BLOCKSIZE_+ 10) * sizeof(unsigned int)); + + m_refCount = new unsigned int[_BLOCKSIZE_]; + memcpy(m_refCount, hb.m_refCount, _BLOCKSIZE_ * sizeof(unsigned int)); + +} + HoleBlockRef::~HoleBlockRef() { delete[] m_tableFree; -- GitLab