aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFranciszek Malinka <franciszek.malinka@gmail.com>2022-10-23 21:15:48 +0200
committerFranciszek Malinka <franciszek.malinka@gmail.com>2022-10-23 21:17:39 +0200
commit48ea6c1b85f0b452e251f16f19b929141dc570e1 (patch)
tree2913112897db15ba3c0186f602e451cb56de3532
parent465091fb023db2d3acd0f391fd4fe3cf233d3d22 (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.cc12
-rw-r--r--komfydb/common/tuple.h16
-rw-r--r--komfydb/common/tuple_test.cc10
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());