susumu.yata
null+****@clear*****
Mon Jul 28 11:06:46 JST 2014
susumu.yata 2014-07-28 11:06:46 +0900 (Mon, 28 Jul 2014) New Revision: 2c0238d2a526a843cd3244a45354d28238f567c2 https://github.com/groonga/grnxx/commit/2c0238d2a526a843cd3244a45354d28238f567c2 Message: Update Expression to use Array. Modified files: include/grnxx/expression.hpp lib/grnxx/expression.cpp test/test_grnxx.cpp Modified: include/grnxx/expression.hpp (+3 -4) =================================================================== --- include/grnxx/expression.hpp 2014-07-28 10:52:48 +0900 (cb3f9f8) +++ include/grnxx/expression.hpp 2014-07-28 11:06:46 +0900 (db8b90f) @@ -1,8 +1,7 @@ #ifndef GRNXX_EXPRESSION_HPP #define GRNXX_EXPRESSION_HPP -#include <vector> - +#include "grnxx/array.hpp" #include "grnxx/types.hpp" namespace grnxx { @@ -112,7 +111,7 @@ class Expression { template <typename T> bool evaluate(Error *error, const RecordSet &record_set, - std::vector<T> *result_set); + Array<T> *result_set); private: const Table *table_; @@ -179,7 +178,7 @@ class ExpressionBuilder { private: const Table *table_; - std::vector<unique_ptr<ExpressionNode>> stack_; + Array<unique_ptr<ExpressionNode>> stack_; explicit ExpressionBuilder(const Table *table); Modified: lib/grnxx/expression.cpp (+26 -60) =================================================================== --- lib/grnxx/expression.cpp 2014-07-28 10:52:48 +0900 (272221c) +++ lib/grnxx/expression.cpp 2014-07-28 11:06:46 +0900 (9a14600) @@ -83,7 +83,7 @@ class Node : public ExpressionNode { } protected: - std::vector<T> values_; + Array<T> values_; }; template <typename T> @@ -155,15 +155,11 @@ class DatumNode : public Node<T> { template <typename T> bool DatumNode<T>::evaluate(Error *error, const RecordSet &record_set) { - try { - if (static_cast<size_t>(record_set.size()) > this->values_.size()) { - this->values_.resize(record_set.size(), datum_); - } + if (static_cast<size_t>(record_set.size()) <= this->values_.size()) { + // The buffer is already filled and there is nothing to do. return true; - } catch (...) { - GRNXX_ERROR_SET(error, NO_MEMORY, "Memory allocation failed"); - return false; } + return this->values_.resize(error, record_set.size(), datum_); } template <> @@ -185,16 +181,12 @@ class DatumNode<Text> : public Node<Text> { }; bool DatumNode<Text>::evaluate(Error *error, const RecordSet &record_set) { - try { - if (static_cast<size_t>(record_set.size()) > this->values_.size()) { - this->values_.resize(record_set.size(), - Text(datum_.data(), datum_.size())); - } + if (static_cast<size_t>(record_set.size()) <= this->values_.size()) { + // The buffer is already filled and there is nothing to do. return true; - } catch (...) { - GRNXX_ERROR_SET(error, NO_MEMORY, "Memory allocation failed"); - return false; } + return this->values_.resize(error, record_set.size(), + Text(datum_.data(), datum_.size())); } // -- RowIDNode -- @@ -209,10 +201,7 @@ class RowIDNode : public Node<Int> { } bool evaluate(Error *error, const RecordSet &record_set) { - try { - this->values_.resize(record_set.size()); - } catch (...) { - GRNXX_ERROR_SET(error, NO_MEMORY, "Memory allocation failed"); + if (!this->values_.resize(error, record_set.size())) { return false; } for (Int i = 0; i < record_set.size(); ++i) { @@ -234,10 +223,7 @@ class ScoreNode : public Node<Float> { } bool evaluate(Error *error, const RecordSet &record_set) { - try { - this->values_.resize(record_set.size()); - } catch (...) { - GRNXX_ERROR_SET(error, NO_MEMORY, "Memory allocation failed"); + if (!this->values_.resize(error, record_set.size())) { return false; } for (Int i = 0; i < record_set.size(); ++i) { @@ -262,10 +248,7 @@ class ColumnNode : public Node<T> { } bool evaluate(Error *error, const RecordSet &record_set) { - try { - this->values_.resize(record_set.size()); - } catch (...) { - GRNXX_ERROR_SET(error, NO_MEMORY, "Memory allocation failed"); + if (!this->values_.resize(error, record_set.size())) { return false; } for (Int i = 0; i < record_set.size(); ++i) { @@ -454,7 +437,7 @@ class BinaryNode : public Node<typename Op::Result> { template <typename Op> bool BinaryNode<Op>::evaluate(Error *error, const RecordSet &record_set) { try { - this->values_.resize(record_set.size()); + this->values_.resize(error, record_set.size()); } catch (...) { GRNXX_ERROR_SET(error, NO_MEMORY, "Memory allocation failed"); return false; @@ -498,11 +481,7 @@ bool LogicalAndNode::filter(Error *error, RecordSet *record_set) { } bool LogicalAndNode::evaluate(Error *error, const RecordSet &record_set) { - // TODO: This logic should be tested. - try { - this->values_.resize(record_set.size()); - } catch (...) { - GRNXX_ERROR_SET(error, NO_MEMORY, "Memory allocation failed"); + if (!this->values_.resize(error, record_set.size())) { return false; } if (!lhs_->evaluate(error, record_set)) { @@ -630,10 +609,7 @@ bool LogicalOrNode::filter(Error *error, RecordSet *record_set) { bool LogicalOrNode::evaluate(Error *error, const RecordSet &record_set) { // TODO: This logic should be tested. - try { - this->values_.resize(record_set.size()); - } catch (...) { - GRNXX_ERROR_SET(error, NO_MEMORY, "Memory allocation failed"); + if (!this->values_.resize(error, record_set.size())) { return false; } if (!lhs_->evaluate(error, record_set)) { @@ -691,15 +667,12 @@ bool Expression::adjust(Error *error, RecordSet *record_set) { template <typename T> bool Expression::evaluate(Error *error, const RecordSet &record_set, - std::vector<T> *result_set) { + Array<T> *result_set) { Node<T> *node = static_cast<Node<T> *>(root_.get()); if (!node->evaluate(error, record_set)) { return false; } - try { - result_set->resize(record_set.size()); - } catch (...) { - GRNXX_ERROR_SET(error, NO_MEMORY, "Memory allocation failed"); + if (!result_set->resize(error, record_set.size())) { return false; } for (Int i = 0; i < result_set->size(); ++i) { @@ -710,22 +683,22 @@ bool Expression::evaluate(Error *error, template bool Expression::evaluate(Error *error, const RecordSet &record_set, - std::vector<Bool> *result_set); + Array<Bool> *result_set); template bool Expression::evaluate(Error *error, const RecordSet &record_set, - std::vector<Int> *result_set); + Array<Int> *result_set); template bool Expression::evaluate(Error *error, const RecordSet &record_set, - std::vector<Float> *result_set); + Array<Float> *result_set); template bool Expression::evaluate(Error *error, const RecordSet &record_set, - std::vector<Time> *result_set); + Array<Time> *result_set); template bool Expression::evaluate(Error *error, const RecordSet &record_set, - std::vector<GeoPoint> *result_set); + Array<GeoPoint> *result_set); template bool Expression::evaluate(Error *error, const RecordSet &record_set, - std::vector<Text> *result_set); + Array<Text> *result_set); Expression::Expression(const Table *table, unique_ptr<ExpressionNode> &&root) : table_(table), @@ -747,10 +720,7 @@ unique_ptr<ExpressionBuilder> ExpressionBuilder::create(Error *error, ExpressionBuilder::~ExpressionBuilder() {} bool ExpressionBuilder::push_datum(Error *error, const Datum &datum) { - try { - stack_.reserve(stack_.size() + 1); - } catch (...) { - GRNXX_ERROR_SET(error, NO_MEMORY, "Memory allocation failed"); + if (!stack_.reserve(error, stack_.size() + 1)) { return false; } // TODO: DatumNode::create() should be provided to get error information. @@ -790,15 +760,12 @@ bool ExpressionBuilder::push_datum(Error *error, const Datum &datum) { GRNXX_ERROR_SET(error, NO_MEMORY, "Memory allocation failed"); return false; } - stack_.push_back(std::move(node)); + stack_.push_back(error, std::move(node)); return true; } bool ExpressionBuilder::push_column(Error *error, String name) { - try { - stack_.reserve(stack_.size() + 1); - } catch (...) { - GRNXX_ERROR_SET(error, NO_MEMORY, "Memory allocation failed"); + if (!stack_.reserve(error, stack_.size() + 1)) { return false; } unique_ptr<ExpressionNode> node; @@ -848,7 +815,7 @@ bool ExpressionBuilder::push_column(Error *error, String name) { GRNXX_ERROR_SET(error, NO_MEMORY, "Memory allocation failed"); return false; } - stack_.push_back(std::move(node)); + stack_.push_back(error, std::move(node)); return true; } @@ -946,7 +913,6 @@ bool ExpressionBuilder::push_logical_and_operator(Error *error) { return true; } - bool ExpressionBuilder::push_logical_or_operator(Error *error) { if (stack_.size() < 2) { // TODO: Define a better error code. Modified: test/test_grnxx.cpp (+1 -1) =================================================================== --- test/test_grnxx.cpp 2014-07-28 10:52:48 +0900 (e6199b0) +++ test/test_grnxx.cpp 2014-07-28 11:06:46 +0900 (f896304) @@ -752,7 +752,7 @@ void test_expression() { assert(expression); // 評価結果を確認する. - std::vector<grnxx::Int> result_set; + grnxx::Array<grnxx::Int> result_set; assert(expression->evaluate(&error, record_set, &result_set)); assert(result_set.size() == 2); assert(result_set[0] == 223); -------------- next part -------------- HTML����������������������������... Download