Esempio n. 1
0
int64_t load_var_int64(const unsigned char* buf, const unsigned char** endp)
{
	return var_int64_u2s(load_var_uint64(buf, endp));
}
void load(Archive& ar, febird::var_int64_t& x, unsigned ver)
{
	x.t = febird::var_int64_u2s(load_var_uint64(ar));
}
Esempio n. 3
0
void ZipIntKeyIndex::build(ColumnType keyType, SortableStrVec& strVec) {
	assert(strVec.m_index.size() == 0);
	m_keyType = keyType;
	void*  data = strVec.m_strpool.data();
	size_t size = strVec.m_strpool.size();
	switch (keyType) {
	default:
		THROW_STD(invalid_argument, "Bad keyType=%s", Schema::columnTypeStr(keyType));
	case ColumnType::Sint08: zipKeys< int8_t >(data, size); break;
	case ColumnType::Uint08: zipKeys<uint8_t >(data, size); break;
	case ColumnType::Sint16: zipKeys< int16_t>(data, size); break;
	case ColumnType::Uint16: zipKeys<uint16_t>(data, size); break;
	case ColumnType::Sint32: zipKeys< int32_t>(data, size); break;
	case ColumnType::Uint32: zipKeys<uint32_t>(data, size); break;
	case ColumnType::Sint64: zipKeys< int64_t>(data, size); break;
	case ColumnType::Uint64: zipKeys<uint64_t>(data, size); break;
	case ColumnType::VarSint: {
		valvec<llong> tmp;
		const byte* pos = strVec.m_strpool.data();
		const byte* end = strVec.m_strpool.end();
		while (pos < end) {
			const byte* next = nullptr;
			llong key = load_var_int64(pos, &next);
			tmp.push_back(key);
			pos = next;
		}
		zipKeys<int64_t>(tmp.data(), tmp.used_mem_size());
		break; }
	case ColumnType::VarUint: {
		valvec<ullong> tmp;
		const byte* pos = strVec.m_strpool.data();
		const byte* end = strVec.m_strpool.end();
		while (pos < end) {
			const byte* next = nullptr;
			ullong key = load_var_uint64(pos, &next);
			tmp.push_back(key);
			pos = next;
		}
		zipKeys<uint64_t>(tmp.data(), tmp.used_mem_size());
		break; }
	}
	valvec<uint32_t> index(m_keys.size(), valvec_no_init());
	for (size_t i = 0; i < index.size(); ++i) index[i] = uint32_t(i);
	std::sort(index.begin(), index.end(), [&](size_t x, size_t y) {
		size_t xkey = m_keys.get(x);
		size_t ykey = m_keys.get(y);
		if (xkey < ykey) return true;
		if (xkey > ykey) return false;
		return x < y;
	});
	auto minIdx = m_index.build_from(index);
	(void)minIdx;
#if !defined(NDEBUG)
	assert(0 == minIdx);
	for(size_t i = 1; i < m_index.size(); ++i) {
		size_t xi = m_index.get(i-1);
		size_t yi = m_index.get(i-0);
		size_t xk = m_keys.get(xi);
		size_t yk = m_keys.get(yi);
		assert(xk <= yk);
	}
#endif
}