#ifndef DBMS_CORE_COLUMN_VECTOR_H #define DBMS_CORE_COLUMN_VECTOR_H #include #include #include #include namespace DB { /** Шаблон столбцов, которые используют для хранения std::vector. */ template class ColumnVector : public IColumn { public: typedef T value_type; typedef std::vector Container_t; ColumnVector() {} ColumnVector(size_t n) : data(n) {} bool isNumeric() const { return IsNumber::value; } ColumnPtr cloneEmpty() const { return new ColumnVector; } size_t size() const { return data.size(); } Field operator[](size_t n) const { return typename NearestFieldType::Type(data[n]); } void cut(size_t start, size_t length) { if (length == 0 || start + length > data.size()) throw Exception("Parameters start = " + Poco::NumberFormatter::format(start) + ", length = " + Poco::NumberFormatter::format(length) + " are out of bound in IColumnVector::cut() method" " (data.size() = " + Poco::NumberFormatter::format(data.size()) + ").", ErrorCodes::PARAMETER_OUT_OF_BOUND); if (start == 0) data.resize(length); else { Container_t tmp(length); memcpy(&tmp[0], &data[start], length * sizeof(data[0])); tmp.swap(data); } } void insert(const Field & x) { data.push_back(boost::get::Type>(x)); } void insertDefault() { data.push_back(T()); } void clear() { data.clear(); } /** Более эффективные методы манипуляции */ Container_t & getData() { return data; } const Container_t & getData() const { return data; } private: Container_t data; }; } #endif