susumu.yata
null+****@clear*****
Fri Jul 25 17:56:27 JST 2014
susumu.yata 2014-07-25 17:56:27 +0900 (Fri, 25 Jul 2014) New Revision: 085be6337bfaf3e677bf82b8b5d6b08a46f2ce06 https://github.com/groonga/grnxx/commit/085be6337bfaf3e677bf82b8b5d6b08a46f2ce06 Message: Update Table to use Array. Modified files: include/grnxx/table.hpp lib/grnxx/table.cpp Modified: include/grnxx/table.hpp (+4 -5) =================================================================== --- include/grnxx/table.hpp 2014-07-25 17:54:15 +0900 (fb82446) +++ include/grnxx/table.hpp 2014-07-25 17:56:27 +0900 (737d3fe) @@ -1,8 +1,7 @@ #ifndef GRNXX_TABLE_HPP #define GRNXX_TABLE_HPP -#include <vector> - +#include "grnxx/array.hpp" #include "grnxx/name.hpp" #include "grnxx/types.hpp" @@ -202,12 +201,12 @@ class Table { private: DB *db_; Name name_; - std::vector<unique_ptr<Column>> columns_; + Array<unique_ptr<Column>> columns_; Column *key_column_; Int num_rows_; Int max_row_id_; - std::vector<uint64_t> bitmap_; - std::vector<std::vector<uint64_t>> bitmap_indexes_; + Array<uint64_t> bitmap_; + Array<Array<uint64_t>> bitmap_indexes_; // Create a new table. // Modified: lib/grnxx/table.cpp (+15 -18) =================================================================== --- lib/grnxx/table.cpp 2014-07-25 17:54:15 +0900 (80390de) +++ lib/grnxx/table.cpp 2014-07-25 17:56:27 +0900 (f6206fc) @@ -242,10 +242,7 @@ Column *Table::create_column(Error *error, static_cast<int>(name.size()), name.data()); return nullptr; } - try { - columns_.reserve(columns_.size() + 1); - } catch (...) { - GRNXX_ERROR_SET(error, NO_MEMORY, "Memory allocation failed"); + if (!columns_.reserve(error, columns_.size() + 1)) { return nullptr; } unique_ptr<Column> new_column = @@ -253,7 +250,7 @@ Column *Table::create_column(Error *error, if (!new_column) { return nullptr; } - columns_.push_back(std::move(new_column)); + columns_.push_back(error, std::move(new_column)); return columns_.back().get(); } @@ -268,7 +265,7 @@ bool Table::remove_column(Error *error, String name) { static_cast<int>(name.size()), name.data()); return false; } - columns_.erase(columns_.begin() + column_id); + columns_.erase(column_id); return true; } @@ -504,10 +501,10 @@ Table::Table() void Table::set_bit(Int i) { bitmap_[i / 64] |= uint64_t(1) << (i % 64); if (bitmap_[i / 64] == ~uint64_t(0)) { - for (auto &bitmap_index : bitmap_indexes_) { + for (Int index_id = 0; index_id < bitmap_indexes_.size(); ++index_id) { i /= 64; - bitmap_index[i / 64] |= uint64_t(1) << (i % 64); - if (bitmap_index[i / 64] != ~uint64_t(0)) { + bitmap_indexes_[index_id][i / 64] |= uint64_t(1) << (i % 64); + if (bitmap_indexes_[index_id][i / 64] != ~uint64_t(0)) { break; } } @@ -518,10 +515,10 @@ void Table::unset_bit(Int i) { bool is_full = bitmap_[i / 64] == ~uint64_t(0); bitmap_[i / 64] &= ~(uint64_t(1) << (i % 64)); if (is_full) { - for (auto &bitmap_index : bitmap_indexes_) { + for (Int index_id = 0; index_id < bitmap_indexes_.size(); ++index_id) { i /= 64; - is_full = bitmap_index[i / 64] == ~uint64_t(0); - bitmap_index[i / 64] &= ~(uint64_t(1) << (i % 64)); + is_full = bitmap_indexes_[index_id][i / 64] == ~uint64_t(0); + bitmap_indexes_[index_id][i / 64] &= ~(uint64_t(1) << (i % 64)); if (!is_full) { break; } @@ -549,12 +546,12 @@ bool Table::reserve_bit(Error *error, Int i) { // TODO: Error handling. size_t block_id = i / 64; if (block_id >= bitmap_.size()) { - bitmap_.resize(block_id + 1, 0); + bitmap_.resize(error, block_id + 1, 0); } - for (auto &bitmap_index : bitmap_indexes_) { + for (Int index_id = 0; index_id < bitmap_indexes_.size(); ++index_id) { block_id /= 64; - if (block_id >= bitmap_index.size()) { - bitmap_index.resize(block_id + 1, 0); + if (block_id >= bitmap_indexes_[index_id].size()) { + bitmap_indexes_[index_id].resize(error, block_id + 1, 0); } else { block_id = 0; break; @@ -563,8 +560,8 @@ bool Table::reserve_bit(Error *error, Int i) { Int depth = bitmap_indexes_.size(); while (block_id > 0) { block_id /= 64; - bitmap_indexes_.resize(depth + 1); - bitmap_indexes_[depth].resize(block_id + 1, 0); + bitmap_indexes_.resize(error, depth + 1); + bitmap_indexes_[depth].resize(error, block_id + 1, 0); if (depth == 0) { bitmap_indexes_[depth][0] = bitmap_[0] != 0; } else { -------------- next part -------------- HTML����������������������������... 下載