[Groonga-commit] groonga/grnxx at b7c7e1b [score-benchmark] Enable Array<Record> to disable score for benchmark.

Back to archive index

susumu.yata null+****@clear*****
Wed Aug 27 09:59:49 JST 2014


susumu.yata	2014-08-27 09:59:49 +0900 (Wed, 27 Aug 2014)

  New Revision: b7c7e1bda39204280d04d2477c1fd3d2c3712b0f
  https://github.com/groonga/grnxx/commit/b7c7e1bda39204280d04d2477c1fd3d2c3712b0f

  Message:
    Enable Array<Record> to disable score for benchmark.

  Modified files:
    include/grnxx/array.hpp
    test/test_pipeline.cpp

  Modified: include/grnxx/array.hpp (+197 -51)
===================================================================
--- include/grnxx/array.hpp    2014-08-26 14:34:02 +0900 (a0e2b54)
+++ include/grnxx/array.hpp    2014-08-27 09:59:49 +0900 (09c762a)
@@ -677,36 +677,59 @@ class ArrayCRef<Record> {
   }
 
   ArrayCRef ref(Int offset = 0) const {
-    return ArrayCRef(records_ + offset, size_ - offset);
+    if (has_score_) {
+      return ArrayCRef(records_ + offset, size_ - offset);
+    } else {
+      return ArrayCRef(row_ids_ + offset, size_ - offset);
+    }
   }
   ArrayCRef ref(Int offset, Int size) const {
-    return ArrayCRef(records_ + offset, size);
+    if (has_score_) {
+      return ArrayCRef(records_ + offset, size);
+    } else {
+      return ArrayCRef(row_ids_ + offset, size);
+    }
+  }
+
+  Bool has_score() const {
+    return has_score_ != 0;
   }
 
   Record get(Int i) const {
-    return records_[i];
+    return has_score_ ? records_[i] : Record(row_ids_[i], 0.0);
   }
   Int get_row_id(Int i) const {
-    return records_[i].row_id;
+    return has_score_ ? records_[i].row_id : row_ids_[i];
   }
   Float get_score(Int i) const {
-    return records_[i].score;
+    return has_score_ ? records_[i].score : 0.0;
   }
 
   Record operator[](Int i) const {
-    return records_[i];
+    return get(i);
   }
 
   Int size() const {
-    return size_;
+    return static_cast<Int>(size_);
   }
 
  private:
-  const Record *records_;
-  Int size_;
+  union {
+    const Int *row_ids_;
+    const Record *records_;
+  };
+  struct {
+    uint64_t has_score_:1;
+    uint64_t size_:63;
+  };
 
   ArrayCRef(const Record *records, Int size)
       : records_(records),
+        has_score_(1),
+        size_(size) {}
+  ArrayCRef(const Int *row_ids, Int size)
+      : row_ids_(row_ids),
+        has_score_(0),
         size_(size) {}
 
   friend class ArrayRef<Value>;
@@ -742,55 +765,102 @@ class ArrayRef<Record> {
   }
 
   ArrayCRef<Record> ref(Int offset = 0) const {
-    return ArrayCRef<Record>(records_ + offset, size_ - offset);
+    if (has_score_) {
+      return ArrayCRef<Record>(records_ + offset, size_ - offset);
+    } else {
+      return ArrayCRef<Record>(row_ids_ + offset, size_ - offset);
+    }
   }
   ArrayCRef<Record> ref(Int offset, Int size) const {
-    return ArrayCRef<Record>(records_ + offset, size);
+    if (has_score_) {
+      return ArrayCRef<Record>(records_ + offset, size);
+    } else {
+      return ArrayCRef<Record>(row_ids_ + offset, size);
+    }
   }
 
   ArrayRef ref(Int offset = 0) {
-    return ArrayRef(records_ + offset, size_ - offset);
+    if (has_score_) {
+      return ArrayRef(records_ + offset, size_ - offset);
+    } else {
+      return ArrayRef(row_ids_ + offset, size_ - offset);
+    }
   }
   ArrayRef ref(Int offset, Int size) {
-    return ArrayRef(records_ + offset, size);
+    if (has_score_) {
+      return ArrayRef(records_ + offset, size);
+    } else {
+      return ArrayRef(row_ids_ + offset, size);
+    }
+  }
+
+  Bool has_score() const {
+    return has_score_ != 0;
   }
 
   Record get(Int i) const {
-    return records_[i];
+    return has_score_ ? records_[i] : Record(row_ids_[i], 0.0);
   }
   Int get_row_id(Int i) const {
-    return records_[i].row_id;
+    return has_score_ ? records_[i].row_id : row_ids_[i];
   }
   Float get_score(Int i) const {
-    return records_[i].score;
+    return has_score_ ? records_[i].score : 0.0;
   }
   void set(Int i, Record record) {
-    records_[i] = record;
+    if (has_score_) {
+      records_[i] = record;
+    } else {
+      row_ids_[i] = record.row_id;
+    }
   }
   void set_row_id(Int i, Int row_id) {
-    records_[i].row_id = row_id;
+    if (has_score_) {
+      records_[i].row_id = row_id;
+    } else {
+      row_ids_[i] = row_id;
+    }
   }
   void set_score(Int i, Float score) {
-    records_[i].score = score;
+    if (has_score_) {
+      records_[i].score = score;
+    }
   }
 
   Record operator[](Int i) const {
-    return records_[i];
+    return get(i);
   }
 
   Int size() const {
-    return size_;
+    return static_cast<Int>(size_);
   }
 
   void swap(Int i, Int j) {
-    std::swap(records_[i], records_[j]);
+    if (has_score_) {
+      std::swap(records_[i], records_[j]);
+    } else {
+      std::swap(row_ids_[i], row_ids_[j]);
+    }
   }
 
  private:
-  Record *records_;
-  Int size_;
+  union {
+    Record *records_;
+    Int *row_ids_;
+  };
+  struct {
+    uint64_t has_score_:1;
+    uint64_t size_:63;
+  };
 
-  ArrayRef(Record *records, Int size) : records_(records), size_(size) {}
+  ArrayRef(Record *records, Int size)
+      : records_(records),
+        has_score_(1),
+        size_(size) {}
+  ArrayRef(Int *row_ids, Int size)
+      : row_ids_(row_ids),
+        has_score_(0),
+        size_(size) {}
 
   friend class Array<Value>;
 };
@@ -798,13 +868,21 @@ class ArrayRef<Record> {
 template <>
 class Array<Record> {
  public:
-  Array() : records_() {}
+  explicit Array(Bool has_score = true)
+      : records_(),
+        row_ids_(),
+        has_score_(has_score) {}
   ~Array() {}
 
-  Array(Array &&array) : records_(std::move(array.records_)) {}
+  Array(Array &&array)
+      : records_(std::move(array.records_)),
+        row_ids_(std::move(array.row_ids_)),
+        has_score_(array.has_score_) {}
 
   Array &operator=(Array &&array) {
     records_ = std::move(array.records_);
+    row_ids_ = std::move(array.row_ids_);
+    has_score_ = array.has_score_;
     return *this;
   }
 
@@ -816,59 +894,93 @@ class Array<Record> {
   }
 
   ArrayCRef<Record> ref(Int offset = 0) const {
-    return ArrayCRef<Record>(records_.data() + offset, size() - offset);
+    if (has_score_) {
+      return ArrayCRef<Record>(records_.data() + offset, size() - offset);
+    } else {
+      return ArrayCRef<Record>(row_ids_.data() + offset, size() - offset);
+    }
   }
   ArrayCRef<Record> ref(Int offset, Int size) const {
-    return ArrayCRef<Record>(records_.data() + offset, size);
+    if (has_score_) {
+      return ArrayCRef<Record>(records_.data() + offset, size);
+    } else {
+      return ArrayCRef<Record>(row_ids_.data() + offset, size);
+    }
   }
 
   ArrayRef<Record> ref(Int offset = 0) {
-    return ArrayRef<Record>(records_.data() + offset, size() - offset);
+    if (has_score_) {
+      return ArrayRef<Record>(records_.data() + offset, size() - offset);
+    } else {
+      return ArrayRef<Record>(row_ids_.data() + offset, size() - offset);
+    }
   }
   ArrayRef<Record> ref(Int offset, Int size) {
-    return ArrayRef<Record>(records_.data() + offset, size);
+    if (has_score_) {
+      return ArrayRef<Record>(records_.data() + offset, size);
+    } else {
+      return ArrayRef<Record>(row_ids_.data() + offset, size);
+    }
+  }
+
+  Bool has_score() const {
+    return has_score_;
   }
 
   Record get(Int i) const {
-    return records_[i];
+    return has_score_ ? records_[i] : Record(row_ids_[i], 0.0);
   }
   Int get_row_id(Int i) const {
-    return records_[i].row_id;
+    return has_score_ ? records_[i].row_id : row_ids_[i];
   }
   Float get_score(Int i) const {
-    return records_[i].score;
+    return has_score_ ? records_[i].score : 0.0;
   }
   void set(Int i, Record record) {
-    records_[i] = record;
+    if (has_score_) {
+      records_[i] = record;
+    } else {
+      row_ids_[i] = record.row_id;
+    }
   }
   void set_row_id(Int i, Int row_id) {
-    records_[i].row_id = row_id;
+    if (has_score_) {
+      records_[i].row_id = row_id;
+    } else {
+      row_ids_[i] = row_id;
+    }
   }
   void set_score(Int i, Float score) {
-    records_[i].score = score;
+    if (has_score_) {
+      records_[i].score = score;
+    }
   }
 
   Record operator[](Int i) const {
-    return records_[static_cast<size_t>(i)];
+    return get(i);
   }
 
   Record front() const {
-    return records_.front();
+    return has_score_ ? records_.front() : Record(row_ids_.front(), 0.0);
   }
 
   Record back() const {
-    return records_.back();
+    return has_score_ ? records_.back() : Record(row_ids_.back(), 0.0);
   }
 
   Int size() const {
-    return static_cast<Int>(records_.size());
+    return static_cast<Int>(has_score_ ? records_.size() : row_ids_.size());
   }
   Int capacity() const {
-    return static_cast<Int>(records_.capacity());
+    return static_cast<Int>(has_score_ ? records_.capacity() : row_ids_.capacity());
   }
 
   bool reserve(Error *error, Int new_size) try {
-    records_.reserve(new_size);
+    if (has_score_) {
+      records_.reserve(new_size);
+    } else {
+      row_ids_.reserve(new_size);
+    }
     return true;
   } catch (...) {
     ArrayErrorReporter::report_memory_error(error);
@@ -876,14 +988,22 @@ class Array<Record> {
   }
 
   bool resize(Error *error, Int new_size) try {
-    records_.resize(new_size);
+    if (has_score_) {
+      records_.resize(new_size);
+    } else {
+      row_ids_.resize(new_size);
+    }
     return true;
   } catch (...) {
     ArrayErrorReporter::report_memory_error(error);
     return false;
   }
   bool resize(Error *error, Int new_size, Record record) try {
-    records_.resize(new_size, record);
+    if (has_score_) {
+      records_.resize(new_size, record);
+    } else {
+      row_ids_.resize(new_size, record.row_id);
+    }
     return true;
   } catch (...) {
     ArrayErrorReporter::report_memory_error(error);
@@ -891,7 +1011,11 @@ class Array<Record> {
   }
 
   bool shrink_to_fit(Error *error) try {
-    records_.shrink_to_fit();
+    if (has_score_) {
+      records_.shrink_to_fit();
+    } else {
+      row_ids_.shrink_to_fit();
+    }
     return true;
   } catch (...) {
     ArrayErrorReporter::report_memory_error(error);
@@ -899,30 +1023,52 @@ class Array<Record> {
   }
 
   void clear() {
-    records_.clear();
+    if (has_score_) {
+      records_.clear();
+    } else {
+      row_ids_.clear();
+    }
   }
 
   void erase(Int i) {
-    records_.erase(records_.begin() + i);
+    if (has_score_) {
+      records_.erase(records_.begin() + i);
+    } else {
+      row_ids_.erase(row_ids_.begin() + i);
+    }
   }
 
   bool push_back(Error *error, Record record) try {
-    records_.push_back(record);
+    if (has_score_) {
+      records_.push_back(record);
+    } else {
+      row_ids_.push_back(record.row_id);
+    }
     return true;
   } catch (...) {
     ArrayErrorReporter::report_memory_error(error);
     return false;
   }
   void pop_back() {
-    records_.pop_back();
+    if (has_score_) {
+      records_.pop_back();
+    } else {
+      row_ids_.pop_back();
+    }
   }
 
   void swap(Int i, Int j) {
-    std::swap(records_[i], records_[j]);
+    if (has_score_) {
+      std::swap(records_[i], records_[j]);
+    } else {
+      std::swap(row_ids_[i], row_ids_[j]);
+    }
   }
 
  private:
   std::vector<Record> records_;
+  std::vector<Int> row_ids_;
+  Bool has_score_;
 };
 
 }  // namespace grnxx

  Modified: test/test_pipeline.cpp (+2 -2)
===================================================================
--- test/test_pipeline.cpp    2014-08-26 14:34:02 +0900 (d7088a4)
+++ test/test_pipeline.cpp    2014-08-27 09:59:49 +0900 (e0be9fd)
@@ -105,7 +105,7 @@ void test_cursor() {
   assert(pipeline);
 
   // Read records through the pipeline.
-  grnxx::Array<grnxx::Record> records;
+  grnxx::Array<grnxx::Record> records(false);
   assert(pipeline->flush(&error, &records));
   assert(records.size() == test.table->num_rows());
 }
@@ -148,7 +148,7 @@ void test_filter() {
   assert(pipeline);
 
   // Read records through the pipeline.
-  grnxx::Array<grnxx::Record> records;
+  grnxx::Array<grnxx::Record> records(false);
   assert(pipeline->flush(&error, &records));
 
   grnxx::Int count = 0;
-------------- next part --------------
HTML����������������������������...
Télécharger 



More information about the Groonga-commit mailing list
Back to archive index