#include "ct_attributes/ct_attributesscalart.h" template CT_AttributesScalarT::CT_AttributesScalarT() : m_manager(nullptr) { CT_ScalarMinMaxManager::InitMinMax(m_min, m_max); } template CT_AttributesScalarT::CT_AttributesScalarT(CT_CIR cir, CT_AbstractXAttributeManager& manager, const SCALAR& min, const SCALAR& max) : m_cir(cir), m_min(min), m_max(max), m_manager(&manager) { dynamic_cast*>(m_manager)->registerAttribute(this, m_min, m_max); } template CT_AttributesScalarT::CT_AttributesScalarT(CT_CIR cir, CT_AbstractXAttributeManager& manager) : m_cir(cir), m_manager(&manager) { CT_ScalarMinMaxManager::InitMinMax(m_min, m_max); visitLocalValues([this](const size_t&, SCALAR value) -> bool { m_min = qMin(m_min, value); m_max = qMax(m_max, value); return true; }); dynamic_cast*>(m_manager)->registerAttribute(this, m_min, m_max); } template CT_AttributesScalarT::~CT_AttributesScalarT() { if(m_manager != nullptr) dynamic_cast*>(m_manager)->template unregisterAttribute(this); } template double CT_AttributesScalarT::scalarAsDoubleAt(const size_t& globalIndex, bool* hasBeenSet) const { return double(convertScalarOfManagerToScalar(m_manager->tAt(globalIndex, hasBeenSet))); } template SCALAR CT_AttributesScalarT::scalarAt(const size_t& globalIndex, bool* hasBeenSet) const { return convertScalarOfManagerToScalar(m_manager->tAt(globalIndex, hasBeenSet)); } template bool CT_AttributesScalarT::hasBeenSet(const size_t& globalIndex) const { return m_manager->hasBeenSet(globalIndex); } template size_t CT_AttributesScalarT::numberOfSetValues() const { return m_manager->numberOfSetValues(); } template bool CT_AttributesScalarT::visitValuesAsDouble(DVisitor v) const { return m_manager->visitValues([this, &v](const size_t& globalIndex, const MANAGER_SCALAR& value) -> bool { return v(globalIndex, double(convertScalarOfManagerToScalar(value))); }); } template bool CT_AttributesScalarT::visitAllIndexesSet(IVisitor v) const { return m_manager->visitAllIndexesSet(v); } template bool CT_AttributesScalarT::hasValues() const { return !m_manager->isEmpty(); } template double CT_AttributesScalarT::minScalarAsDouble() const { return double(minScalar()); } template double CT_AttributesScalarT::maxScalarAsDouble() const { return double(maxScalar()); } template SCALAR CT_AttributesScalarT::minScalar() const { return dynamic_cast*>(m_manager)->template min(this); } template SCALAR CT_AttributesScalarT::maxScalar() const { return dynamic_cast*>(m_manager)->template max(this); } template bool CT_AttributesScalarT::visitValues(SVisitor v) const { return m_manager->visitValues([this, &v](const size_t& globalIndex, const MANAGER_SCALAR& value) -> bool { return v(globalIndex, convertScalarOfManagerToScalar(value)); }); } template double CT_AttributesScalarT::scalarAsDoubleAtLocalIndex(const size_t& localIndex) const { size_t count = 0; double scalarAsDouble = std::numeric_limits::quiet_NaN(); visitLocalValuesAsDouble([&count, &localIndex, &scalarAsDouble](const size_t&, double value) -> bool { if(count == localIndex) { scalarAsDouble = value; return false; } ++count; return true; }); return scalarAsDouble; } template SCALAR CT_AttributesScalarT::scalarAtLocalIndex(const size_t& localIndex) const { size_t count = 0; SCALAR scalarFounded = SCALAR(); visitLocalValues([&count, &localIndex, &scalarFounded](const size_t&, SCALAR value) -> bool { if(count == localIndex) { scalarFounded = value; return false; } ++count; return true; }); return scalarFounded; } template size_t CT_AttributesScalarT::numberOfSetLocalValues() const { CT_AbstractCloudIndex* ci = m_cir->abstractCloudIndex(); const size_t size = ci->size(); size_t finalSize = 0; for(size_t i=0; ihasBeenSet(ci->indexAt(i))) ++finalSize; } return finalSize; } template bool CT_AttributesScalarT::hasLocalValues() const { CT_AbstractCloudIndex* ci = m_cir->abstractCloudIndex(); const size_t size = ci->size(); for(size_t i=0; ihasBeenSet(ci->indexAt(i))) return true; } return false; } template bool CT_AttributesScalarT::visitLocalValuesAsDouble(CT_AttributesScalarT::DVisitor v) const { return visitLocalValues([&v](const size_t& globalIndex, SCALAR value) -> bool { return v(globalIndex, double(value)); }); } template bool CT_AttributesScalarT::visitLocalIndexesSet(IVisitor v) const { CT_AbstractCloudIndex* ci = m_cir->abstractCloudIndex(); const size_t size = ci->size(); for(size_t i=0; iindexAt(i); if(m_manager->hasBeenSet(globalIndex) && !v(globalIndex)) return false; } return true; } template double CT_AttributesScalarT::minLocalScalarAsDouble() const { return double(m_min); } template double CT_AttributesScalarT::maxLocalScalarAsDouble() const { return double(m_max); } template SCALAR CT_AttributesScalarT::minLocalScalar() const { return m_min; } template SCALAR CT_AttributesScalarT::maxLocalScalar() const { return m_max; } template void CT_AttributesScalarT::setLocalMinMax(const SCALAR& min, const SCALAR& max) { m_min = min; m_max = max; dynamic_cast*>(m_manager)->updateAttribute(this, m_min, m_max); } template bool CT_AttributesScalarT::visitLocalValues(CT_AttributesScalarT::SVisitor v) const { CT_AbstractCloudIndex* ci = m_cir->abstractCloudIndex(); const size_t size = ci->size(); bool hasBeenSet = false; for(size_t i=0; iindexAt(i); const MANAGER_SCALAR& value = m_manager->tAt(globalIndex, &hasBeenSet); if(hasBeenSet) { if(!v(globalIndex, convertScalarOfManagerToScalar(value))) return false; } } return true; } template CT_AbstractXAttributeManager* CT_AttributesScalarT::scalarsManager() const { return m_manager; }