diff options
author | Franciszek Malinka <franciszek.malinka@gmail.com> | 2022-10-23 21:15:48 +0200 |
---|---|---|
committer | Franciszek Malinka <franciszek.malinka@gmail.com> | 2022-10-23 21:17:39 +0200 |
commit | 48ea6c1b85f0b452e251f16f19b929141dc570e1 (patch) | |
tree | 2913112897db15ba3c0186f602e451cb56de3532 | |
parent | 465091fb023db2d3acd0f391fd4fe3cf233d3d22 (diff) |
Change tuple interface
Got rid of shared_ptr which adds additional overhead. Now it seems that
there is a place for optimization in the future, but for now
vector<Field*> should be OK. Just need to take extra caution.
-rw-r--r-- | komfydb/common/tuple.cc | 12 | ||||
-rw-r--r-- | komfydb/common/tuple.h | 16 | ||||
-rw-r--r-- | komfydb/common/tuple_test.cc | 10 |
3 files changed, 17 insertions, 21 deletions
diff --git a/komfydb/common/tuple.cc b/komfydb/common/tuple.cc index 3ab7438..6d775b2 100644 --- a/komfydb/common/tuple.cc +++ b/komfydb/common/tuple.cc @@ -5,22 +5,22 @@ namespace komfydb::common { -Tuple::Tuple(const TupleDesc& td) : td(td) { - fields.resize(td.Length()); +Tuple::Tuple(const TupleDesc* td) : td(td) { + fields.resize(td->Length()); } -TupleDesc Tuple::GetTupleDesc() { - return TupleDesc(td); +const TupleDesc* Tuple::GetTupleDesc() { + return td; } -absl::StatusOr<std::shared_ptr<Field>> Tuple::GetField(int i) { +absl::StatusOr<Field*> Tuple::GetField(int i) { if (fields.size() <= i || i < 0) { return absl::InvalidArgumentError("Index out of range"); } return fields[i]; } -absl::Status Tuple::SetField(int i, std::shared_ptr<Field> f) { +absl::Status Tuple::SetField(int i, Field* f) { if (fields.size() <= i || i < 0) { return absl::InvalidArgumentError("Index out of range"); } diff --git a/komfydb/common/tuple.h b/komfydb/common/tuple.h index de80605..22fab9a 100644 --- a/komfydb/common/tuple.h +++ b/komfydb/common/tuple.h @@ -16,22 +16,18 @@ namespace komfydb::common { // representing a Tuple in memory. class Tuple { protected: - TupleDesc td; + const TupleDesc *td; - std::vector<std::shared_ptr<Field>> fields; + std::vector<Field*> fields; public: - Tuple(const TupleDesc& td); + Tuple(const TupleDesc* td); - TupleDesc GetTupleDesc(); + const TupleDesc* GetTupleDesc(); - // TODO it would be much nicer to have absl::StatusOr<Field> instead, but - // unfortunately it cannot be done as StatusOr tries to instatiate - // the object of the Field type (which is an abstract class). - // Try changing Field class so it can work (and don't break the abstraction). - absl::StatusOr<std::shared_ptr<Field>> GetField(int i); + absl::StatusOr<Field*> GetField(int i); - absl::Status SetField(int i, std::shared_ptr<Field> f); + absl::Status SetField(int i, Field* f); operator std::string() const; diff --git a/komfydb/common/tuple_test.cc b/komfydb/common/tuple_test.cc index 0ce0296..903c819 100644 --- a/komfydb/common/tuple_test.cc +++ b/komfydb/common/tuple_test.cc @@ -16,12 +16,12 @@ TEST(Tuple, StringConversion) { std::vector<std::string> nv{"f1", "f2"}; TupleDesc td(tv, nv); - Tuple tuple(td); + Tuple tuple(&td); - std::shared_ptr<IntField> f(new IntField(1)); - std::cout << tuple.SetField(0, f).ok() << "\n"; - std::cout << tuple.SetField(0, f).message() << "\n"; - EXPECT_TRUE(tuple.SetField(0, f).ok()); + IntField f(1); + std::cout << tuple.SetField(0, &f).ok() << "\n"; + std::cout << tuple.SetField(0, &f).message() << "\n"; + EXPECT_TRUE(tuple.SetField(0, &f).ok()); auto f1 = tuple.GetField(0); ASSERT_TRUE(f1.ok()); |