/* * Copyright (C) 2007-2013 Xagasoft, All rights reserved. * * This file is part of the libgats library and is released under the * terms of the license contained in the file LICENSE. */ #ifndef GATS_INTEGER_H #define GATS_INTEGER_H #include "gats-qt/object.h" #include #include namespace Gats { class Integer : public Gats::Object { Q_OBJECT; public: Integer(); Integer( int64_t iVal ); virtual ~Integer(); virtual Object *clone() const; virtual Type getType() const { return typeInteger; } int64_t getValue() const { return iVal; } int64_t value() const { return iVal; } void setValue( int64_t iNewVal ) { iVal = iNewVal; } virtual void write( QIODevice &rOut ) const; virtual void read( QIODevice &rIn, char cType ); template static void readPackedInt( QIODevice &rStream, itype &rOut ) { int8_t b; rOut = 0; bool bNeg; rStream.read( (char *)&b, 1 ); bNeg = ( b&0x40 ); rOut |= (itype(b&0x3F)); int c = 0; while( (b&0x80) ) { rStream.read( (char *)&b, 1 ); rOut |= (itype(b&0x7F)) << (6+7*(c++)); } if( bNeg ) rOut = -rOut; } template static void writePackedInt( QIODevice &rStream, itype iIn ) { uint8_t b; if( iIn < 0 ) { iIn = -iIn; b = (iIn&0x3F); if( iIn > b ) b |= 0x80 | 0x40; else b |= 0x40; } else { b = (iIn&0x3F); if( iIn > b ) b |= 0x80; } rStream.write( (const char *)&b, 1 ); iIn = iIn >> 6; while( iIn ) { b = (iIn&0x7F); if( iIn > b ) b |= 0x80; rStream.write( (const char *)&b, 1 ); iIn = iIn >> 7; } } private: int64_t iVal; }; }; //Bu::Formatter &operator<<( Bu::Formatter &f, const Gats::Integer &i ); #endif