[Groonga-commit] groonga/grnxx [master] Update grnxx::Map to use grnxx::Charset.

Back to archive index

susumu.yata null+****@clear*****
Tue Mar 12 12:37:54 JST 2013


susumu.yata	2013-03-12 12:37:54 +0900 (Tue, 12 Mar 2013)

  New Revision: 0ba3e2a8db5bd97c6ed7b4a088a5177dfb175943
  https://github.com/groonga/grnxx/commit/0ba3e2a8db5bd97c6ed7b4a088a5177dfb175943

  Message:
    Update grnxx::Map to use grnxx::Charset.

  Modified files:
    lib/map.cpp
    lib/map.hpp
    test/test_map.cpp

  Modified: lib/map.cpp (+7 -6)
===================================================================
--- lib/map.cpp    2013-03-12 12:24:52 +0900 (729450c)
+++ lib/map.cpp    2013-03-12 12:37:54 +0900 (a9b8a4f)
@@ -17,6 +17,7 @@
 */
 #include "map.hpp"
 
+#include "charset.hpp"
 #include "exception.hpp"
 #include "logger.hpp"
 #include "map/double_array.hpp"
@@ -29,7 +30,7 @@ MapHeader::MapHeader() : type(MAP_UNKNOWN) {}
 
 MapScan::~MapScan() {}
 
-MapScan *MapScan::open(Map *map, const Slice &query, GetChar get_char) {
+MapScan *MapScan::open(Map *map, const Slice &query, const Charset *charset) {
   std::unique_ptr<MapScan> scan(new (std::nothrow) MapScan);
   if (!scan) {
     GRNXX_ERROR() << "new grnxx::MapScan failed";
@@ -37,7 +38,7 @@ MapScan *MapScan::open(Map *map, const Slice &query, GetChar get_char) {
   }
   scan->map_ = map;
   scan->query_ = query;
-  scan->get_char_ = get_char;
+  scan->charset_ = charset;
   return scan.release();
 }
 
@@ -50,8 +51,8 @@ bool MapScan::next() {
       return true;
     }
     // Move to the next character.
-    if (get_char_) {
-      offset_ += get_char_(query_left).size();
+    if (charset_) {
+      offset_ += charset_->get_char(query_left).size();
     } else {
       ++offset_;
     }
@@ -143,8 +144,8 @@ void Map::unlink(io::Pool pool, uint32_t block_id) {
   // TODO: Unknown type error!
 }
 
-MapScan *Map::scan(const Slice &query, MapScan::GetChar get_char) {
-  return MapScan::open(this, query, get_char);
+MapScan *Map::scan(const Slice &query, const Charset *charset) {
+  return MapScan::open(this, query, charset);
 }
 
 }  // namespace grnxx

  Modified: lib/map.hpp (+6 -7)
===================================================================
--- lib/map.hpp    2013-03-12 12:24:52 +0900 (c45bc10)
+++ lib/map.hpp    2013-03-12 12:37:54 +0900 (10d7514)
@@ -23,6 +23,9 @@
 
 namespace grnxx {
 
+class Charset;
+class Map;
+
 enum MapType : int32_t {
   MAP_UNKNOWN      = 0,
   MAP_DOUBLE_ARRAY = 1   // grnxx::map::DoubleArray.
@@ -122,17 +125,13 @@ inline std::ostream &operator<<(std::ostream &stream, const MapKey &key) {
   return stream << key.slice();
 }
 
-class Map;
-
 class MapScan {
  public:
-  typedef Slice (*GetChar)(const Slice &);
-
   ~MapScan();
 
   // Create an object to find keys in "query".
   static MapScan *open(Map *map, const Slice &query,
-                       GetChar get_char = nullptr);
+                       const Charset *charset = nullptr);
 
   // Scan the rest of the query and return true iff a key is found (success).
   // On success, the found key is accessible via accessors.
@@ -166,7 +165,7 @@ class MapScan {
   uint64_t size_;
   int64_t key_id_;
   MapKey key_;
-  GetChar get_char_;
+  const Charset *charset_;
 
   MapScan();
 };
@@ -219,7 +218,7 @@ class Map {
 
   // Start scan to find keys in "query" and return an object for the scan.
   // The object must be deleted after the scan.
-  MapScan *scan(const Slice &query, MapScan::GetChar get_char = nullptr);
+  MapScan *scan(const Slice &query, const Charset *charset = nullptr);
 
   // TODO
 };

  Modified: test/test_map.cpp (+46 -10)
===================================================================
--- test/test_map.cpp    2013-03-12 12:24:52 +0900 (bbe5f74)
+++ test/test_map.cpp    2013-03-12 12:37:54 +0900 (57479f3)
@@ -21,6 +21,7 @@
 #include <unordered_set>
 #include <vector>
 
+#include "charset.hpp"
 #include "map.hpp"
 #include "logger.hpp"
 #include "time/time.hpp"
@@ -165,12 +166,7 @@ void test_scan() {
 
   assert(!scan->next());
 
-  grnxx::MapScan::GetChar get_char =
-      [](const grnxx::Slice &slice) -> grnxx::Slice {
-        return slice ? slice.prefix(2) : grnxx::Slice();
-      };
-
-  scan.reset(map->scan(query, get_char));
+  scan.reset(map->scan(query, grnxx::Charset::open(grnxx::CHARSET_UTF_8)));
 
   assert(scan->next());
   assert(scan->offset() == 0);
@@ -179,10 +175,50 @@ void test_scan() {
   assert(scan->key() == "ABCD");
 
   assert(scan->next());
-  assert(scan->offset() == 6);
-  assert(scan->size() == 2);
-  assert(scan->key_id() == 7);
-  assert(scan->key() == "FG");
+  assert(scan->offset() == 5);
+  assert(scan->size() == 3);
+  assert(scan->key_id() == 5);
+  assert(scan->key() == "EFG");
+
+  assert(!scan->next());
+
+  map.reset(grnxx::Map::create(options, pool));
+
+  assert(map->insert("今"));
+  assert(map->insert("今日"));
+  assert(map->insert("明日"));
+  assert(map->insert("良い"));
+  assert(map->insert("悪い"));
+  assert(map->insert("天気"));
+  assert(map->insert("です"));
+
+  query = "今日は良い天気ですね";
+
+  scan.reset(map->scan(query, grnxx::Charset::open(grnxx::CHARSET_UTF_8)));
+
+  assert(scan->next());
+  assert(scan->offset() == 0);
+  assert(scan->size() == 6);
+  assert(scan->key_id() == 1);
+  assert(scan->key() == "今日");
+
+  assert(scan->next());
+  assert(scan->offset() == 9);
+  assert(scan->size() == 6);
+  assert(scan->key_id() == 3);
+  assert(scan->key() == "良い");
+
+  assert(scan->next());
+  assert(scan->offset() == 15);
+  assert(scan->size() == 6);
+  assert(scan->key_id() == 5);
+  assert(scan->key() == "天気");
+
+  assert(scan->next());
+  assert(scan->offset() == 21);
+  assert(scan->size() == 6);
+  assert(scan->key_id() == 6);
+  assert(scan->key() == "です");
 
   assert(!scan->next());
 }
-------------- next part --------------
HTML����������������������������...
Download 



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