Less dependencies [#CLICKHOUSE-2952].

This commit is contained in:
Alexey Milovidov 2017-04-16 07:03:14 +03:00
parent 83ed2a794b
commit ef3557950c
3 changed files with 36 additions and 25 deletions

View File

@ -1,16 +1,30 @@
#pragma once
#include <cstddef>
#include <memory>
#include <vector>
#include <type_traits>
#include <Core/Row.h>
#include <DataTypes/IDataType.h>
#include <Common/typeid_cast.h>
#include <Common/Arena.h>
#include <Core/Types.h>
#include <Core/Field.h>
#include <Common/Exception.h>
namespace DB
{
class Arena;
class ReadBuffer;
class WriteBuffer;
class IColumn;
class IDataType;
using DataTypePtr = std::shared_ptr<IDataType>;
using DataTypes = std::vector<DataTypePtr>;
using AggregateDataPtr = char *;
using ConstAggregateDataPtr = const char *;
namespace ErrorCodes
{
extern const int AGGREGATE_FUNCTION_DOESNT_ALLOW_PARAMETERS;
@ -19,9 +33,6 @@ namespace ErrorCodes
extern const int ARGUMENT_OUT_OF_BOUND;
}
using AggregateDataPtr = char *;
using ConstAggregateDataPtr = const char *;
/** Aggregate functions interface.
* Instances of classes with this interface do not contain the data itself for aggregation,
@ -142,7 +153,7 @@ public:
bool hasTrivialDestructor() const override
{
return __has_trivial_destructor(Data);
return std::is_trivially_destructible<Data>::value;
}
size_t sizeOfData() const override
@ -153,7 +164,7 @@ public:
/// NOTE: Currently not used (structures with aggregation state are put without alignment).
size_t alignOfData() const override
{
return __alignof__(Data);
return alignof(Data);
}
};

View File

@ -98,11 +98,11 @@ struct HashTableCell
/// HashTableCell(const value_type & value_, const State & state) : key(value_) {}
/// Получить то, что будет value_type контейнера.
value_type & getValue() { return key; }
value_type & getValue() { return key; }
const value_type & getValue() const { return key; }
/// Получить ключ.
static Key & getKey(value_type & value) { return value; }
static Key & getKey(value_type & value) { return value; }
static const Key & getKey(const value_type & value) { return value; }
/// Равны ли ключи у ячеек.
@ -155,10 +155,10 @@ struct HashTableGrower
UInt8 size_degree = initial_size_degree;
/// Размер хэш-таблицы в ячейках.
size_t bufSize() const { return 1 << size_degree; }
size_t bufSize() const { return 1 << size_degree; }
size_t maxFill() const { return 1 << (size_degree - 1); }
size_t mask() const { return bufSize() - 1; }
size_t maxFill() const { return 1 << (size_degree - 1); }
size_t mask() const { return bufSize() - 1; }
/// Из значения хэш-функции получить номер ячейки в хэш-таблице.
size_t place(size_t x) const { return x & mask(); }
@ -200,7 +200,7 @@ struct HashTableGrower
template <size_t key_bits>
struct HashTableFixedGrower
{
size_t bufSize() const { return 1 << key_bits; }
size_t bufSize() const { return 1 << key_bits; }
size_t place(size_t x) const { return x; }
/// Тут можно было бы написать __builtin_unreachable(), но компилятор не до конца всё оптимизирует, и получается менее эффективно.
size_t next(size_t pos) const { return pos + 1; }
@ -221,15 +221,15 @@ struct ZeroValueStorage<true, Cell>
{
private:
bool has_zero = false;
char zero_value_storage[sizeof(Cell)] __attribute__((__aligned__(__alignof__(Cell)))); /// Кусок памяти для элемента с ключём 0.
typename std::aligned_storage<sizeof(Cell), alignof(Cell)>::type zero_value_storage; /// Storage of element with zero key.
public:
bool hasZero() const { return has_zero; }
void setHasZero() { has_zero = true; }
void clearHasZero() { has_zero = false; }
Cell * zeroValue() { return reinterpret_cast<Cell*>(zero_value_storage); }
const Cell * zeroValue() const { return reinterpret_cast<const Cell*>(zero_value_storage); }
Cell * zeroValue() { return reinterpret_cast<Cell*>(&zero_value_storage); }
const Cell * zeroValue() const { return reinterpret_cast<const Cell*>(&zero_value_storage); }
};
template <typename Cell>
@ -240,7 +240,7 @@ struct ZeroValueStorage<false, Cell>
void clearHasZero() {}
Cell * zeroValue() { return nullptr; }
const Cell * zeroValue() const { return nullptr; }
const Cell * zeroValue() const { return nullptr; }
};
@ -416,7 +416,7 @@ protected:
void destroyElements()
{
if (!__has_trivial_destructor(Cell))
if (!std::is_trivially_destructible<Cell>::value)
for (iterator it = begin(); it != end(); ++it)
it.ptr->~Cell();
}
@ -605,10 +605,10 @@ public:
protected:
const_iterator iteratorTo(const Cell * ptr) const { return const_iterator(this, ptr); }
iterator iteratorTo(Cell * ptr) { return iterator(this, ptr); }
const_iterator iteratorToZero() const { return iteratorTo(this->zeroValue()); }
iterator iteratorToZero() { return iteratorTo(this->zeroValue()); }
const_iterator iteratorTo(const Cell * ptr) const { return const_iterator(this, ptr); }
iterator iteratorTo(Cell * ptr) { return iterator(this, ptr); }
const_iterator iteratorToZero() const { return iteratorTo(this->zeroValue()); }
iterator iteratorToZero() { return iteratorTo(this->zeroValue()); }
/// Если ключ нулевой - вставить его в специальное место и вернуть true.

View File

@ -348,7 +348,7 @@ public:
void clear()
{
if (!__has_trivial_destructor(Cell))
if (!std::is_trivially_destructible<Cell>::value)
for (iterator it = begin(); it != end(); ++it)
it.ptr->~Cell();