diff --git a/include/caosdb/entity.h b/include/caosdb/entity.h index 19277cd1a4d0bf0229ee4f9c7463e1562f7996a0..cbdf0730b996f73a0d3dd98dbe7172143329125e 100644 --- a/include/caosdb/entity.h +++ b/include/caosdb/entity.h @@ -328,7 +328,7 @@ public: private: static auto CreateProtoProperty() -> ProtoProperty *; - caosdb::entity::v1alpha1::Property *wrapped; + mutable caosdb::entity::v1alpha1::Property *wrapped; }; /** @@ -340,8 +340,18 @@ class Properties { public: // TODO(fspreck) Implementations needed (basically everything). See Parents // container for inspiration. - [[nodiscard]] auto At(int index) const -> const Property &; - auto Append(const Property &property) -> void; + /** + * Return the current size of the properties container. + * + * This is also the number of properties the owningn entity currently has. + */ + [[nodiscard]] inline auto Size() const -> int { return wrapped->size(); } + /** + * Return the property at the given index. + */ + [[nodiscard]] auto At(int index) const -> const Property { + return Property(&(wrapped->at(index))); + } friend class Entity; @@ -352,6 +362,13 @@ private: *wrapped) : wrapped(wrapped){}; + /** + * Append a property + * + * This increases the Size() by one. + */ + auto Append(const Property &property) -> void; + ::google::protobuf::RepeatedPtrField<caosdb::entity::v1alpha1::Property> *wrapped; }; diff --git a/src/caosdb/entity.cpp b/src/caosdb/entity.cpp index 8e032e47219241a50237e0a2d782410da0629212..c54a1506ae1b99fb7fa8a218ce2428d2e907fa37 100644 --- a/src/caosdb/entity.cpp +++ b/src/caosdb/entity.cpp @@ -124,6 +124,15 @@ auto Property::SetDatatype(const std::string &datatype) -> void { this->wrapped->set_datatype(datatype); } +auto Properties::Append(const Property &property) -> void { + auto *destination = this->wrapped->Add(); + destination->Swap(property.wrapped); + + property.wrapped->Clear(); + + property.wrapped = destination; +} + [[nodiscard]] auto Entity::GetParents() const -> const Parents & { return parents; }