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