Skip to content

Commit 1383127

Browse files
mmarineBlueQuartzimikejackson
authored andcommitted
DataStructure root node
* DataStructure now derives from BaseGroup to directly serve as the root node. * Updated BaseGroup to prevent adding a DataStructure as a child node.
1 parent 68a3617 commit 1383127

5 files changed

Lines changed: 81 additions & 48 deletions

File tree

src/simplnx/DataStructure/BaseGroup.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#include "BaseGroup.hpp"
22

33
#include "simplnx/DataStructure/DataPath.hpp"
4+
#include "simplnx/DataStructure/DataStructure.hpp"
45
#include "simplnx/Utilities/StringUtilities.hpp"
56

67
using namespace nx::core;
@@ -21,7 +22,7 @@ BaseGroup::BaseGroup(const BaseGroup& other)
2122
{
2223
}
2324

24-
BaseGroup::BaseGroup(BaseGroup&& other)
25+
BaseGroup::BaseGroup(BaseGroup&& other) noexcept
2526
: DataObject(std::move(other))
2627
, m_DataMap(std::move(other.m_DataMap))
2728
{
@@ -105,6 +106,11 @@ bool BaseGroup::canInsert(const DataObject* obj) const
105106
{
106107
return false;
107108
}
109+
// Do not allow adding a DataStructure to a BaseGroup
110+
if(dynamic_cast<const DataStructure*>(obj) != nullptr)
111+
{
112+
return false;
113+
}
108114
if(contains(obj) || contains(obj->getName()))
109115
{
110116
return false;

src/simplnx/DataStructure/BaseGroup.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ class SIMPLNX_EXPORT BaseGroup : public DataObject
6767
* the provided BaseGroup.
6868
* @param other The BaseGroup to move from
6969
*/
70-
BaseGroup(BaseGroup&& other);
70+
BaseGroup(BaseGroup&& other) noexcept;
7171

7272
/**
7373
* @brief Destroys the BaseGroup and removes it from the list of it's
@@ -279,7 +279,7 @@ class SIMPLNX_EXPORT BaseGroup : public DataObject
279279
/**
280280
* @brief Clears the group of all children.
281281
*/
282-
void clear();
282+
virtual void clear();
283283

284284
/**
285285
* @brief Returns an iterator to the beginning of the container.

src/simplnx/DataStructure/DataObject.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ DataObject& DataObject::operator=(DataObject&& rhs) noexcept
7676

7777
DataObject::~DataObject() noexcept
7878
{
79-
if(m_DataStructure == nullptr)
79+
if(m_DataStructure == nullptr || m_DataStructure == this)
8080
{
8181
return;
8282
}

src/simplnx/DataStructure/DataStructure.cpp

Lines changed: 48 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,14 @@ const std::string k_Delimiter = "|--";
2929
namespace nx::core
3030
{
3131
DataStructure::DataStructure()
32-
: m_IsValid(true)
32+
: BaseGroup(*this, k_TypeName)
33+
, m_IsValid(true)
3334
{
3435
}
3536

3637
DataStructure::DataStructure(const DataStructure& dataStructure)
37-
: m_DataObjects(dataStructure.m_DataObjects)
38-
, m_RootGroup(dataStructure.m_RootGroup)
38+
: BaseGroup(dataStructure)
39+
, m_DataObjects(dataStructure.m_DataObjects)
3940
, m_IsValid(dataStructure.m_IsValid)
4041
, m_NextId(dataStructure.m_NextId)
4142
{
@@ -54,16 +55,16 @@ DataStructure::DataStructure(const DataStructure& dataStructure)
5455
}
5556
// Updates all DataMaps with the corresponding m_DataObjects pointers.
5657
// Updates all DataObjects with their new DataStructure
57-
m_RootGroup.setDataStructure(this);
58+
setDataStructure(this);
5859
}
5960

6061
DataStructure::DataStructure(DataStructure&& dataStructure) noexcept
61-
: m_DataObjects(std::move(dataStructure.m_DataObjects))
62-
, m_RootGroup(std::move(dataStructure.m_RootGroup))
62+
: BaseGroup(std::move(dataStructure))
63+
, m_DataObjects(std::move(dataStructure.m_DataObjects))
6364
, m_IsValid(dataStructure.m_IsValid)
6465
, m_NextId(dataStructure.m_NextId)
6566
{
66-
m_RootGroup.setDataStructure(this);
67+
getDataMap().setDataStructure(this);
6768
}
6869

6970
DataStructure::~DataStructure()
@@ -98,7 +99,7 @@ size_t DataStructure::getSize() const
9899

99100
void DataStructure::clear()
100101
{
101-
auto topDataIds = m_RootGroup.getKeys();
102+
auto topDataIds = getDataMap().getKeys();
102103
for(auto dataId : topDataIds)
103104
{
104105
removeData(dataId);
@@ -125,7 +126,7 @@ LinkedPath DataStructure::getLinkedPath(const DataPath& path) const
125126
try
126127
{
127128
std::vector<DataObject::IdType> pathIds;
128-
const DataObject* data = m_RootGroup[path[0]];
129+
const DataObject* data = getDataMap()[path[0]];
129130
const BaseGroup* parent = dynamic_cast<const BaseGroup*>(data);
130131
pathIds.push_back(data->getId());
131132

@@ -163,7 +164,7 @@ Result<LinkedPath> DataStructure::makePath(const DataPath& path)
163164
{
164165
std::vector<DataObject::IdType> pathIds;
165166
std::string name = path[0];
166-
const DataObject* data = m_RootGroup[name];
167+
const DataObject* data = getDataMap()[name];
167168
if(data == nullptr)
168169
{
169170
data = nx::core::DataGroup::Create(*this, name);
@@ -272,7 +273,7 @@ DataObject* DataStructure::getData(const DataPath& path)
272273
{
273274
return nullptr;
274275
}
275-
DataObject* targetObject = m_RootGroup[path[0]];
276+
DataObject* targetObject = getDataMap()[path[0]];
276277
for(usize index = 1; index < path.getLength(); index++)
277278
{
278279
if(targetObject == nullptr)
@@ -351,7 +352,7 @@ const DataObject* DataStructure::getData(const DataPath& path) const
351352
{
352353
return nullptr;
353354
}
354-
const DataObject* targetObject = m_RootGroup[path[0]];
355+
const DataObject* targetObject = getDataMap()[path[0]];
355356
for(usize index = 1; index < path.getLength(); index++)
356357
{
357358
if(targetObject == nullptr)
@@ -508,6 +509,11 @@ void DataStructure::dataDeleted(DataObject::IdType identifier, const std::string
508509
notify(msg);
509510
}
510511

512+
DataMap& DataStructure::getRootGroup()
513+
{
514+
return getDataMap();
515+
}
516+
511517
std::vector<DataObject*> DataStructure::getTopLevelData() const
512518
{
513519
std::vector<DataObject*> topLevel(m_RootGroup.getSize(), nullptr);
@@ -520,35 +526,26 @@ std::vector<DataObject*> DataStructure::getTopLevelData() const
520526
return topLevel;
521527
}
522528

523-
const DataMap& DataStructure::getDataMap() const
524-
{
525-
return m_RootGroup;
526-
}
527-
528-
DataMap& DataStructure::getRootGroup()
529-
{
530-
return m_RootGroup;
531-
}
532-
533529
bool DataStructure::insertTopLevel(const std::shared_ptr<DataObject>& obj)
534530
{
535531
if(obj == nullptr)
536532
{
537533
return false;
538534
}
539535

540-
if(m_RootGroup.contains(obj.get()) || m_RootGroup.contains(obj->getName()))
536+
auto& dataMap = getDataMap();
537+
if(dataMap.contains(obj.get()) || dataMap.contains(obj->getName()))
541538
{
542539
return false;
543540
}
544541

545-
return m_RootGroup.insert(obj);
542+
return dataMap.insert(obj);
546543
}
547544

548545
bool DataStructure::removeTopLevel(DataObject* data)
549546
{
550547
std::string name = data->getName();
551-
if(!m_RootGroup.remove(data))
548+
if(!getDataMap().remove(data))
552549
{
553550
return false;
554551
}
@@ -585,22 +582,22 @@ bool DataStructure::finishAddingObject(const std::shared_ptr<DataObject>& dataOb
585582

586583
DataStructure::Iterator DataStructure::begin()
587584
{
588-
return m_RootGroup.begin();
585+
return getDataMap().begin();
589586
}
590587

591588
DataStructure::Iterator DataStructure::end()
592589
{
593-
return m_RootGroup.end();
590+
return getDataMap().end();
594591
}
595592

596593
DataStructure::ConstIterator DataStructure::begin() const
597594
{
598-
return m_RootGroup.begin();
595+
return getDataMap().begin();
599596
}
600597

601598
DataStructure::ConstIterator DataStructure::end() const
602599
{
603-
return m_RootGroup.end();
600+
return getDataMap().end();
604601
}
605602

606603
bool DataStructure::insert(const std::shared_ptr<DataObject>& dataObject, const DataPath& dataPath)
@@ -644,7 +641,7 @@ bool DataStructure::insertIntoRoot(const std::shared_ptr<DataObject>& dataObject
644641
return false;
645642
}
646643

647-
if(!m_RootGroup.insert(dataObject))
644+
if(!getDataMap().insert(dataObject))
648645
{
649646
return false;
650647
}
@@ -734,7 +731,7 @@ void DataStructure::notify(const std::shared_ptr<AbstractDataStructureMessage>&
734731
DataStructure& DataStructure::operator=(const DataStructure& rhs)
735732
{
736733
m_DataObjects = rhs.m_DataObjects;
737-
m_RootGroup = rhs.m_RootGroup;
734+
getDataMap() = rhs.getDataMap();
738735
m_IsValid = rhs.m_IsValid;
739736
m_NextId = rhs.m_NextId;
740737

@@ -760,17 +757,33 @@ DataStructure& DataStructure::operator=(const DataStructure& rhs)
760757
DataStructure& DataStructure::operator=(DataStructure&& rhs) noexcept
761758
{
762759
m_DataObjects = std::move(rhs.m_DataObjects);
763-
m_RootGroup = std::move(rhs.m_RootGroup);
760+
getDataMap() = std::move(rhs.getDataMap());
764761
m_IsValid = std::move(rhs.m_IsValid);
765762
m_NextId = std::move(rhs.m_NextId);
766763

767764
applyAllDataStructure();
768765
return *this;
769766
}
770767

768+
std::shared_ptr<DataObject> DataStructure::deepCopy(const DataPath& copyPath)
769+
{
770+
// DataStructure cannot be contained in another DataStructure...
771+
return nullptr;
772+
}
773+
774+
DataObject* DataStructure::shallowCopy()
775+
{
776+
return new DataStructure(*this);
777+
}
778+
779+
std::string DataStructure::getTypeName() const
780+
{
781+
return k_TypeName;
782+
}
783+
771784
void DataStructure::applyAllDataStructure()
772785
{
773-
m_RootGroup.setDataStructure(this);
786+
setDataStructure(this);
774787
}
775788

776789
nonstd::expected<void, std::string> DataStructure::validateNumberOfTuples(const std::vector<DataPath>& dataPaths) const
@@ -861,7 +874,7 @@ void DataStructure::resetIds(DataObject::IdType startingId)
861874
dataObjectPtr->checkUpdatedIds(updatedIdsMap);
862875
}
863876
}
864-
m_RootGroup.updateIds(updatedIdsMap);
877+
getDataMap().updateIds(updatedIdsMap);
865878
}
866879

867880
void DataStructure::exportHierarchyAsGraphViz(std::ostream& outputStream) const
@@ -1015,7 +1028,7 @@ Result<> DataStructure::validateGeometries() const
10151028
* the compile will fail if the unit tests are enabled. Which they are on all the CI machines.
10161029
*/
10171030
Result<> result;
1018-
for(const auto& dataObject : m_RootGroup)
1031+
for(const auto& dataObject : getDataMap())
10191032
{
10201033
auto dataObjectType = dataObject.second->getDataObjectType();
10211034
if(dataObjectType >= DataObject::Type::IGeometry && dataObjectType <= DataObject::Type::TetrahedralGeom)

src/simplnx/DataStructure/DataStructure.hpp

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#pragma once
22

33
#include "simplnx/Common/Result.hpp"
4+
#include "simplnx/DataStructure/BaseGroup.hpp"
45
#include "simplnx/DataStructure/DataMap.hpp"
56
#include "simplnx/DataStructure/DataObject.hpp"
67
#include "simplnx/DataStructure/LinkedPath.hpp"
@@ -40,7 +41,7 @@ inline const std::string k_ImportableTag = "Importable";
4041
* geometries, and scalars are added to the structure. The DataStructure allows
4142
* parents to be added to or removed from DataObjects.
4243
*/
43-
class SIMPLNX_EXPORT DataStructure
44+
class SIMPLNX_EXPORT DataStructure : public BaseGroup
4445
{
4546
using WeakCollectionType = std::map<DataObject::IdType, std::weak_ptr<DataObject>>;
4647

@@ -56,6 +57,8 @@ class SIMPLNX_EXPORT DataStructure
5657
bool finishAddingObject(const std::shared_ptr<DataObject>& obj, const std::optional<DataObject::IdType>& parent = {});
5758

5859
public:
60+
static constexpr StringLiteral k_TypeName = "DataStructure";
61+
5962
using SignalType = nod::signal<void(DataStructure*, const std::shared_ptr<AbstractDataStructureMessage>&)>;
6063
using Iterator = DataMap::Iterator;
6164
using ConstIterator = DataMap::ConstIterator;
@@ -95,7 +98,7 @@ class SIMPLNX_EXPORT DataStructure
9598
* @brief Clears the DataStructure by removing all DataObjects. The next
9699
* DataObject ID remains unchanged after the operation.
97100
*/
98-
void clear();
101+
void clear() override;
99102

100103
/**
101104
* @brief Returns the IdType for the DataObject found at the specified DataPath. The
@@ -744,12 +747,6 @@ class SIMPLNX_EXPORT DataStructure
744747
*/
745748
std::vector<DataObject*> getTopLevelData() const;
746749

747-
/**
748-
* @brief Returns a reference to the DataMap backing the top level of the DataStructure.
749-
* @return const DataMap&
750-
*/
751-
const DataMap& getDataMap() const;
752-
753750
/**
754751
* @brief Inserts a new DataObject into the DataStructure nested under the given
755752
* DataPath. If the DataPath is empty, the DataObject is added directly to
@@ -865,6 +862,24 @@ class SIMPLNX_EXPORT DataStructure
865862
*/
866863
DataStructure& operator=(DataStructure&& rhs) noexcept;
867864

865+
/**
866+
* @brief Returns a deep copy of the DataStructure.
867+
* @return DataObject*
868+
*/
869+
std::shared_ptr<DataObject> deepCopy(const DataPath& copyPath) override;
870+
871+
/**
872+
* @brief Returns a shallow copy of the DataObject.
873+
* @return DataObject*
874+
*/
875+
DataObject* shallowCopy() override;
876+
877+
/**
878+
* @brief Returns typename of the DataObject as a std::string.
879+
* @return std::string
880+
*/
881+
std::string getTypeName() const override;
882+
868883
/**
869884
* @brief Sets the next ID to use when constructing a DataObject.
870885
* Because IDs are created to be unique, this should only be called when
@@ -1020,7 +1035,6 @@ class SIMPLNX_EXPORT DataStructure
10201035
// Variables
10211036
SignalType m_Signal;
10221037
WeakCollectionType m_DataObjects;
1023-
DataMap m_RootGroup;
10241038
bool m_IsValid = false;
10251039
DataObject::IdType m_NextId = 1;
10261040
};

0 commit comments

Comments
 (0)