Navigation Menu

Skip to content

Commit

Permalink
Update grnxx::map::ArrayMap to use grnxx::map::KeyStore.
Browse files Browse the repository at this point in the history
  • Loading branch information
s-yata committed Jun 17, 2013
1 parent e3aba7c commit e48df0d
Show file tree
Hide file tree
Showing 8 changed files with 33 additions and 214 deletions.
92 changes: 29 additions & 63 deletions lib/grnxx/map/array_map.cpp
Expand Up @@ -34,8 +34,7 @@ ArrayMap<T>::ArrayMap()
: storage_(nullptr),
storage_node_id_(STORAGE_INVALID_NODE_ID),
header_(nullptr),
keys_(),
bits_() {}
keys_() {}

template <typename T>
ArrayMap<T>::~ArrayMap() {}
Expand Down Expand Up @@ -79,43 +78,42 @@ MapType ArrayMap<T>::type() const {

template <typename T>
int64_t ArrayMap<T>::max_key_id() const {
return header_->max_key_id;
return keys_->max_key_id();
}

template <typename T>
uint64_t ArrayMap<T>::num_keys() const {
return header_->num_keys;
return keys_->num_keys();
}

template <typename T>
bool ArrayMap<T>::get(int64_t key_id, Key *key) {
if ((key_id < MAP_MIN_KEY_ID) || (key_id > header_->max_key_id)) {
if ((key_id < MAP_MIN_KEY_ID) || (key_id > max_key_id())) {
// Out of range.
return false;
}
bool bit;
if (!bits_->get(key_id, &bit)) {
if (!keys_->get_bit(key_id, &bit)) {
// Error.
return false;
}
if (!bit) {
// Not found.
return false;
}
return keys_->get(key_id, key);
if (!keys_->get_key(key_id, key)) {
// Error.
return false;
}
return true;
}

template <typename T>
bool ArrayMap<T>::unset(int64_t key_id) {
if (!get(key_id)) {
if (!keys_->unset(key_id)) {
// Not found or error.
return false;
}
if (!bits_->set(key_id, false)) {
// Error.
return false;
}
--header_->num_keys;
return true;
}

Expand All @@ -129,7 +127,7 @@ bool ArrayMap<T>::reset(int64_t key_id, KeyArg dest_key) {
// Found.
return false;
}
if (!keys_->set(key_id, Helper<T>::normalize(dest_key))) {
if (!keys_->reset(key_id, Helper<T>::normalize(dest_key))) {
// Error.
return false;
}
Expand All @@ -139,15 +137,15 @@ bool ArrayMap<T>::reset(int64_t key_id, KeyArg dest_key) {
template <typename T>
bool ArrayMap<T>::find(KeyArg key, int64_t *key_id) {
const Key normalized_key = map::Helper<T>::normalize(key);
for (int64_t i = MAP_MIN_KEY_ID; i <= header_->max_key_id; ++i) {
for (int64_t i = MAP_MIN_KEY_ID; i <= max_key_id(); ++i) {
bool bit;
if (!bits_->get(i, &bit)) {
if (!keys_->get_bit(i, &bit)) {
// Error.
return false;
}
if (bit) {
Key stored_key;
if (!keys_->get(i, &stored_key)) {
if (!keys_->get_key(i, &stored_key)) {
// Error.
return false;
}
Expand All @@ -166,16 +164,15 @@ bool ArrayMap<T>::find(KeyArg key, int64_t *key_id) {
template <typename T>
bool ArrayMap<T>::add(KeyArg key, int64_t *key_id) {
const Key normalized_key = Helper<T>::normalize(key);
int64_t next_key_id = MAP_INVALID_KEY_ID;
for (int64_t i = MAP_MIN_KEY_ID; i <= header_->max_key_id; ++i) {
for (int64_t i = MAP_MIN_KEY_ID; i <= max_key_id(); ++i) {
bool bit;
if (!bits_->get(i, &bit)) {
if (!keys_->get_bit(i, &bit)) {
// Error.
return false;
}
if (bit) {
Key stored_key;
if (!keys_->get(i, &stored_key)) {
if (!keys_->get_key(i, &stored_key)) {
// Error.
return false;
}
Expand All @@ -186,37 +183,12 @@ bool ArrayMap<T>::add(KeyArg key, int64_t *key_id) {
}
return false;
}
} else if (next_key_id == MAP_INVALID_KEY_ID) {
next_key_id = i;
}
}
if (next_key_id == MAP_INVALID_KEY_ID) {
next_key_id = header_->max_key_id + 1;
if (next_key_id > MAP_MAX_KEY_ID) {
GRNXX_ERROR() << "too many keys: next_key_id = " << next_key_id
<< ", max_key_id = " << MAP_MAX_KEY_ID;
return false;
}
}
const uint64_t unit_id = next_key_id / bits_->unit_size();
const uint64_t unit_bit = 1ULL << (next_key_id % bits_->unit_size());
BitArrayUnit * const unit = bits_->get_unit(unit_id);
if (!unit) {
// Error.
return false;
}
if (!keys_->set(next_key_id, normalized_key)) {
if (!keys_->add(normalized_key, key_id)) {
// Error.
return false;
}
*unit |= unit_bit;
if (next_key_id == (header_->max_key_id + 1)) {
++header_->max_key_id;
}
++header_->num_keys;
if (key_id) {
*key_id = next_key_id;
}
return true;
}

Expand All @@ -227,11 +199,10 @@ bool ArrayMap<T>::remove(KeyArg key) {
// Not found or error.
return false;
}
if (!bits_->set(key_id, false)) {
if (!keys_->unset(key_id)) {
// Error.
return false;
}
--header_->num_keys;
return true;
}

Expand All @@ -240,15 +211,15 @@ bool ArrayMap<T>::replace(KeyArg src_key, KeyArg dest_key, int64_t *key_id) {
const Key normalized_src_key = Helper<T>::normalize(src_key);
const Key normalized_dest_key = Helper<T>::normalize(dest_key);
int64_t src_key_id = MAP_INVALID_KEY_ID;
for (int64_t i = MAP_MIN_KEY_ID; i <= header_->max_key_id; ++i) {
for (int64_t i = MAP_MIN_KEY_ID; i <= max_key_id(); ++i) {
bool bit;
if (!bits_->get(i, &bit)) {
if (!keys_->get_bit(i, &bit)) {
// Error.
return false;
}
if (bit) {
Key stored_key;
if (!keys_->get(i, &stored_key)) {
if (!keys_->get_key(i, &stored_key)) {
// Error.
return false;
}
Expand All @@ -266,7 +237,7 @@ bool ArrayMap<T>::replace(KeyArg src_key, KeyArg dest_key, int64_t *key_id) {
// Not found.
return false;
}
if (!keys_->set(src_key_id, normalized_dest_key)) {
if (!keys_->reset(src_key_id, normalized_dest_key)) {
// Error.
return false;
}
Expand All @@ -278,9 +249,7 @@ bool ArrayMap<T>::replace(KeyArg src_key, KeyArg dest_key, int64_t *key_id) {

template <typename T>
bool ArrayMap<T>::truncate() {
header_->max_key_id = MAP_MIN_KEY_ID - 1;
header_->num_keys = 0;
return true;
return keys_->truncate();
}

template <typename T>
Expand All @@ -295,14 +264,12 @@ bool ArrayMap<T>::create_map(Storage *storage, uint32_t storage_node_id,
storage_node_id_ = storage_node.id();
header_ = static_cast<Header *>(storage_node.body());
*header_ = Header();
keys_.reset(KeyArray::create(storage, storage_node_id_));
bits_.reset(BitArray::create(storage, storage_node_id_));
if (!keys_ || !bits_) {
keys_.reset(KeyStore<T>::create(storage, storage_node_id_));
if (!keys_) {
storage->unlink_node(storage_node_id_);
return false;
}
header_->keys_storage_node_id = keys_->storage_node_id();
header_->bits_storage_node_id = bits_->storage_node_id();
return true;
}

Expand All @@ -320,9 +287,8 @@ bool ArrayMap<T>::open_map(Storage *storage, uint32_t storage_node_id) {
}
storage_node_id_ = storage_node_id;
header_ = static_cast<Header *>(storage_node.body());
keys_.reset(KeyArray::open(storage, header_->keys_storage_node_id));
bits_.reset(BitArray::open(storage, header_->bits_storage_node_id));
if (!keys_ || !bits_) {
keys_.reset(KeyStore<T>::open(storage, header_->keys_storage_node_id));
if (!keys_) {
return false;
}
return true;
Expand Down
9 changes: 2 additions & 7 deletions lib/grnxx/map/array_map.hpp
Expand Up @@ -23,8 +23,7 @@
#include <memory>

#include "grnxx/map.hpp"
#include "grnxx/map/array_map/bit_array.hpp"
#include "grnxx/map/array_map/key_array.hpp"
#include "grnxx/map/key_store.hpp"
#include "grnxx/types.hpp"

namespace grnxx {
Expand All @@ -41,9 +40,6 @@ struct Header;
template <typename T>
class ArrayMap : public Map<T> {
using Header = array_map::Header;
using KeyArray = typename array_map::KeyArray<T>::Type;
using BitArray = typename array_map::BitArray<T>::Type;
using BitArrayUnit = typename BitArray::Unit;

public:
using Key = typename Map<T>::Key;
Expand Down Expand Up @@ -78,8 +74,7 @@ class ArrayMap : public Map<T> {
Storage *storage_;
uint32_t storage_node_id_;
Header *header_;
std::unique_ptr<KeyArray> keys_;
std::unique_ptr<BitArray> bits_;
std::unique_ptr<KeyStore<T>> keys_;

bool create_map(Storage *storage, uint32_t storage_node_id,
const MapOptions &options);
Expand Down
4 changes: 1 addition & 3 deletions lib/grnxx/map/array_map/Makefile.am
Expand Up @@ -8,7 +8,5 @@ libgrnxx_map_array_map_la_SOURCES = \

libgrnxx_map_array_map_includedir = ${includedir}/grnxx/map/array_map
libgrnxx_map_array_map_include_HEADERS = \
bit_array.hpp \
dummy.hpp \
header.hpp \
key_array.hpp
header.hpp
62 changes: 0 additions & 62 deletions lib/grnxx/map/array_map/bit_array.hpp

This file was deleted.

2 changes: 0 additions & 2 deletions lib/grnxx/map/array_map/dummy.cpp
Expand Up @@ -17,9 +17,7 @@
*/
#include "grnxx/map/array_map/dummy.hpp"

#include "grnxx/map/array_map/bit_array.hpp"
#include "grnxx/map/array_map/header.hpp"
#include "grnxx/map/array_map/key_array.hpp"

namespace grnxx {
namespace map {
Expand Down
5 changes: 1 addition & 4 deletions lib/grnxx/map/array_map/header.cpp
Expand Up @@ -25,10 +25,7 @@ namespace array_map {

Header::Header()
: map_type(MAP_ARRAY),
keys_storage_node_id(STORAGE_INVALID_NODE_ID),
bits_storage_node_id(STORAGE_INVALID_NODE_ID),
max_key_id(MAP_MIN_KEY_ID - 1),
num_keys(0) {}
keys_storage_node_id(STORAGE_INVALID_NODE_ID) {}

} // namespace array_map
} // namespace map
Expand Down
3 changes: 0 additions & 3 deletions lib/grnxx/map/array_map/header.hpp
Expand Up @@ -30,9 +30,6 @@ namespace array_map {
struct Header {
MapType map_type;
uint32_t keys_storage_node_id;
uint32_t bits_storage_node_id;
int64_t max_key_id;
uint64_t num_keys;

Header();
};
Expand Down

0 comments on commit e48df0d

Please sign in to comment.