12 #ifndef XPACE_COMPRESS_H 13 #define XPACE_COMPRESS_H 15 #include "data/compress/list_int.h" 20 template <
typename N,
typename B = N>
45 return std::numeric_limits<N>::min();
50 return std::numeric_limits<N>::max();
70 return num == rhs.num;
75 return num != rhs.num;
125 template<
typename T,
typename LIST>
127 (
const LIST& list, T minVal = 0);
133 return b->addVar(gcf - 1);
138 return 1 + b->getVar<
uint32>();
145 return static_cast<UNSIGN(N)
>(num) / d;
152 return Xpace::bitsNeeded(num);
160 return b->addBits(bits, num);
167 return MemBitStream::lenVar(num);
174 return b->addVar(num);
183 return b->getBits<N>(numBits);
191 return b->getVar<N>();
200 template <
typename CH>
209 size_t cs(1 + b->getBits<
size_t>(3 + (
sizeof(*ch) > 1)));
210 for ( ; length--; ++ch)
211 *ch = b->getBits<
uint>(cs);
215 template <
typename STR>
224 template <
typename CH>
231 for (
size_t i(length); i--; ++str)
232 max_ch = std::max(max_ch, *str);
233 return Xpace::bitsNeeded(max_ch);
236 template <
typename CH>
243 return MemBitStream::lenVar(len) +
248 template <
typename STR>
256 template <
typename CH>
263 if (!b->addVar(length))
268 if (!b->addBits(3 + (
sizeof(*str) > 1), cs - 1))
272 for (
size_t i(length); i--; ++ch)
273 if (!b->addBits(cs, *ch))
280 template <
typename STR>
289 template <
typename STR>
311 str(pool->allocString<STR>(b->getVar<
uint>()))
330 const typename STR::charType*
data 359 return str == rhs.str;
365 return str != rhs.str;
371 return str > rhs.str;
377 return str < rhs.str;
418 template<
typename T,
typename LIST>
420 (
const LIST& , T = 0)
489 return qHash(QByteArray(reinterpret_cast<const char*>(cs.str.data),
int(
sizeof(
typename STR::charType) * cs.str.length)));
494 static STR min_str, max_str;
497 template <
typename STR>
513 prefix(b->getVar<
uint>()),
534 (
const diffType& rhs)
537 return (prefix == rhs.prefix) && (str == rhs.str);
540 (
const diffType& rhs)
543 return !(*
this == rhs);
546 (
const diffType& rhs)
549 if (prefix > rhs.prefix)
551 if (prefix < rhs.prefix)
553 return str > rhs.str;
556 (
const diffType& rhs)
559 if (prefix < rhs.prefix)
561 if (prefix > rhs.prefix)
563 return str < rhs.str;
574 const diffType&
operator*
582 const diffType&
operator/
591 template<
typename T,
typename LIST>
632 return MemBitStream::lenVar(prefix) + str.lenVar();
639 return b->addVar(prefix) + str.addVar(b);
668 (
const diffType& rhs,
677 return ::qHash(dt.prefix) + qHash(dt.str);
687 template <
typename T>
692 (
const std::vector<T>& vals,
697 (
const std::vector<T>& vals,
701 (
const std::vector<T>& vals,
706 findLength(vals, count, pool);
707 continueEncode(vals, b);
712 std::vector<T>* vals,
714 size_t maxVals = ~0);
718 std::vector<typename T::diffType> deltas;
719 iList<typename T::diffType> deltas_list;
723 size_t vals_len, deltas_len;
730 (
uint precision = ~0);
733 (
const std::vector<DecimalFloat>& startVals,
739 std::vector<DecimalFloat>* vals);
742 const uint precision;
743 std::vector<CompressibleInt<int64> > ints;
757 (
const std::vector<T>& vals,
764 return vals.front().lenVar();
769 vals_list.set(vals, count, pool);
770 vals_len = vals_list.getLen();
773 for (
typename std::vector<T>::const_iterator v(vals.begin()); ++v != vals.begin() + count; )
774 deltas.push_back(v->diff(*(v - 1), pool));
775 deltas_list.set(deltas, count - 1, pool);
777 deltas_len = MemBitStream::lenVar(vals[0]) + deltas_list.getLen();
779 return std::min(vals_len, deltas_len);
785 (
const std::vector<T>& vals,
795 vals.front().addVar(b);
804 if (vals_len <= deltas_len)
812 vals.front().addVar(b);
813 deltas_list.encode(b);
822 std::vector<T>* vals,
828 vals->push_back(T::getVar(b, pool));
832 deltas_list.decode(b, pool, &deltas, maxVals);
833 for (
typename std::vector<typename T::diffType>::const_iterator d(deltas.begin()); d != deltas.end(); ++d)
834 vals->push_back(vals->back().sum(*d, pool));
837 vals_list.decode(b, pool, vals, maxVals);
843 template <
typename N,
typename B>
844 template<
typename T,
typename LIST>
848 auto it(list.begin());
849 while (*it == minVal)
850 if (++it == list.end())
853 std::vector<uint32> factors;
854 typename T::normType n(*it - minVal);
855 static uint32 primes[] = { 2u, 3u, 5u, 7u, 11u, 13u, 17u, 19u, 23u, 29u, 31u, 37u, 41u,
856 43u, 47u, 53u, 59u, 61u, 67u, 71u, 73u, 79u, 83u, 89u, 97u,
860 divide<typename T::normType> d(n, *f);
863 factors.push_back(*f);
871 for (std::vector<uint32>::const_iterator f(factors.begin()); f < factors.end(); ++f)
875 for (it = list.begin(); ++it != list.end(); )
877 if (*it == *(it - 1))
881 for (std::vector<uint32>::iterator f(factors.begin()); f < factors.end(); ++f)
883 divide<typename T::normType> d(n, *f);
888 if ((gcf /= *f) == 1)
901 template <
typename STR>
909 typename STR::charType *l(str.data), *r(rhs.str.data);
910 size_t len(std::min(str.length, rhs.str.length));
911 for (result.prefix = 0; len -- && (*l == *r); ++l, ++r)
914 typename STR::charType* d(result.str.str.data = reinterpret_cast<typename STR::charType*>(pool->alloc(
sizeof(
typename STR::charType) * (result.str.str.length = str.length - result.prefix))));
916 while (l < str.data + str.length)
919 assert(ptrdiff_t(result.str.str.length) == d - result.str.str.data);
924 template <
typename STR>
926 (
const diffType& rhs,
931 result.str.length = rhs.prefix + rhs.str.str.length;
932 result.str.data =
reinterpret_cast<typename STR::charType*
>(pool->alloc(
sizeof(
typename STR::charType) * result.str.length));
934 typename STR::charType* d(result.str.data);
936 typename STR::charType *l(str.data);
937 for (
size_t prefix(rhs.prefix); prefix--; )
940 typename STR::charType *r(rhs.str.str.data);
941 for (
size_t body(rhs.str.str.length); body--; )
static bool writeGCF(uint32 gcf, MemBitStream *b)
void continueEncode(const std::vector< T > &vals, MemBitStream *b)
const Xpace_Char16 Xpace_Data_Type type
CompressibleString< STR > baseType
Copyright (C) 2012 Xpace, LLC.
void decode(MemBitStream *b, std::vector< T > *vals, BytePool *pool=0, size_t maxVals=~0)
static N getBits(MemBitStream *b, size_t numBits, BytePool *=0)
bool addVar(MemBitStream *b) const
uint const Xpace_Char8 size_t len
static uint32 GCF(const LIST &list, T minVal=0)
void readString(MemBitStream *b, CH *ch, size_t length)
CompressibleInt< UNSIGN(N), N > normType
static uint32 readGCF(MemBitStream *b)
static N getVar(MemBitStream *b, BytePool *=0)
bool writeString(const CH *str, size_t length, MemBitStream *b)
size_t charSize(const CH *str, size_t length)
size_t bitsNeeded() const
diffType diff(const CompressibleString &, BytePool *) const
Xpace_StoreAccess Xpace_Table * result
N sum(diffType rhs, BytePool *=0)
size_t findLength(const std::vector< T > &vals, size_t count, BytePool *pool=0)
size_t stringLen(const CH *str, size_t len)
uint const Xpace_Char8 * data
UNSIGN(N) operator/(uint d) const
Xpace project main namespace
diffType diff(const CompressibleInt< N, B > &rhs, BytePool *=0) const
CompressibleInt< SIGN(N), N > diffType
bool addBits(size_t bits, MemBitStream *b) const
CompressibleInt< B > baseType
CompressibleString sum(const diffType &, BytePool *) const