#ifndef CT_DENSEATTRIBUTEMANAGER_H #define CT_DENSEATTRIBUTEMANAGER_H #include #include "ct_global/ct_cloudscontext.h" #include "ct_global/ct_repositorymanager.h" #include "ct_attributes/managers/abstract/ct_abstractxattributemanager.h" #include "ct_attributes/setters/ct_denseattributesetter.h" #include template class CT_DenseAttributeManager : public CT_AbstractXAttributeManager { using SuperClass = CT_AbstractXAttributeManager; public: using Setter = CT_DenseAttributeSetter; using SetterPtr = std::unique_ptr; Setter createAttributesSetter(TCIR cir); SetterPtr createAttributesSetterPtr(TCIR cir); bool hasBeenSet(const size_t& globalIndex) const final; bool visitValues(typename CT_AbstractXAttributeManager::Visitor v) const final; bool visitAllIndexesSet(typename CT_AbstractXAttributeManager::IVisitor v) const final; size_t numberOfSetValues() const final; bool isEmpty() const final; const T& tAt(const size_t& globalIndex, bool* hasBeenSet = nullptr) const final; const T& tAtLocalIndex(const size_t& localIndex) const final; bool copyAndModifyAttributesOfSForD(CT_CIR source, CT_CIR destination, typename SuperClass::AttributeModificator modificator = nullptr) final; void createCollectionsIfNotCreated(); protected: typename CT_DenseAttributeSetter::PtrAttributesCollectionType mAttributes; typename CT_DenseAttributeSetter::PtrAttributeBitCollectionType mBits; T mDefaultValue; bool localIndexToGlobalIndex(const size_t& localIndex, size_t& globalIndex) const; }; template typename CT_DenseAttributeManager::Setter CT_DenseAttributeManager::createAttributesSetter(TCIR cir) { createCollectionsIfNotCreated(); return CT_DenseAttributeSetter(cir, mAttributes, mBits); } template typename CT_DenseAttributeManager::SetterPtr CT_DenseAttributeManager::createAttributesSetterPtr(TCIR cir) { createCollectionsIfNotCreated(); return std::make_unique::Setter>(cir, mAttributes, mBits); } template bool CT_DenseAttributeManager::hasBeenSet(const size_t& globalIndex) const { if(mAttributes.isNull()) return false; return mBits->cloudT()->value(globalIndex) == true; } template bool CT_DenseAttributeManager::visitValues(typename CT_AbstractXAttributeManager::Visitor v) const { if(mAttributes.isNull()) return true; const auto attributes = mAttributes->cloudT(); const auto bits = mBits->cloudT(); const size_t size = bits->size(); for(size_t i=0; ivalue(i) && !v(i, (*attributes)[i])) return false; } return true; } template bool CT_DenseAttributeManager::visitAllIndexesSet(typename CT_AbstractXAttributeManager::IVisitor v) const { if(mAttributes.isNull()) return true; const auto bits = mBits->cloudT(); const size_t size = bits->size(); for(size_t i=0; ivalue(i) && !v(i)) return false; } return true; } template size_t CT_DenseAttributeManager::numberOfSetValues() const { if(mAttributes.isNull()) return false; const auto bits = mBits->cloudT(); const size_t size = bits->size(); size_t count = 0; for(size_t i=0; ivalue(i)) ++count; } return count; } template bool CT_DenseAttributeManager::isEmpty() const { if(mAttributes.isNull()) return true; const auto bits = mBits->cloudT(); const size_t size = bits->size(); for(size_t i=0; ivalue(i)) return false; } return true; } template const T& CT_DenseAttributeManager::tAt(const size_t& globalIndex, bool* hasBeenSet) const { if(mAttributes.isNull()) { if(hasBeenSet != nullptr) *hasBeenSet = false; return mDefaultValue; } const auto attributes = mAttributes->cloudT(); if(hasBeenSet != nullptr) (*hasBeenSet) = mBits->cloudT()->value(globalIndex); return (*attributes)[globalIndex]; } template const T& CT_DenseAttributeManager::tAtLocalIndex(const size_t& localIndex) const { size_t globalIndex = 0; if(!localIndexToGlobalIndex(localIndex, globalIndex)) return mDefaultValue; const auto attributes = mAttributes->cloudT(); return (*attributes)[globalIndex]; } template bool CT_DenseAttributeManager::copyAndModifyAttributesOfSForD(CT_CIR source, CT_CIR destination, typename SuperClass::AttributeModificator modificator) { if(mAttributes.isNull() // || source.dynamicCast().isNull() // correction AP 09/11/2022 || source.isNull() || destination.isNull() || destination.dynamicCast().isNull()) return false; auto sourceCI = source->abstractCloudIndex(); auto destCI = destination->abstractCloudIndex(); const auto sourceSize = sourceCI->size(); const auto destSize = destCI->size(); if(destSize == 0) return true; if(hasBeenSet(destCI->indexAt(0))) return false; auto setter = createAttributesSetter(destination.dynamicCast()); if(modificator == nullptr) { for(unsigned long i=0; iindexAt(i), tAt(sourceCI->indexAt(i))); } } else { T destValue; for(unsigned long i=0; iindexAt(i); const T& sourceValue = tAt(sourceCI->indexAt(i)); const auto destinationGlobalIndex = destCI->indexAt(i); const int ret = modificator(sourceGlobalIndex, sourceValue, destinationGlobalIndex, destValue); if(ret > 0) setter.setValueWithGlobalIndex(destinationGlobalIndex, destValue); else if(ret < 0) return true; } } return true; } template void CT_DenseAttributeManager::createCollectionsIfNotCreated() { if(!mAttributes.isNull()) return; mAttributes = PS_REPOSITORY->createNewCloudT::RegisteredAttributesCollectionType, typename CT_DenseAttributeSetter::AttributesCollectionType>(CT_Repository::SyncCloudWith(syncWithT)); mBits = PS_REPOSITORY->createNewCloudT::RegisteredAttributeBitCollectionType, typename CT_DenseAttributeSetter::AttributeBitCollectionType>(CT_Repository::SyncCloudWith(syncWithT)); } template bool CT_DenseAttributeManager::localIndexToGlobalIndex(const size_t& localIndex, size_t& globalIndex) const { if(mAttributes.isNull()) return false; const auto bits = mBits->cloudT(); const size_t size = bits->size(); size_t count = 0; for(size_t i=0; ivalue(i)) { if(count == localIndex) { globalIndex = i; return true; } ++count; } } return false; } #endif // CT_DENSEATTRIBUTEMANAGER_H