diff options
| author | Mike Buland <eichlan@xagasoft.com> | 2010-08-14 07:12:29 +0000 | 
|---|---|---|
| committer | Mike Buland <eichlan@xagasoft.com> | 2010-08-14 07:12:29 +0000 | 
| commit | 1b797548dff7e2475826ba29a71c3f496008988f (patch) | |
| tree | 2a81ee2e8fa2f17fd95410aabbf44533d35a727a | |
| download | libgats-1b797548dff7e2475826ba29a71c3f496008988f.tar.gz libgats-1b797548dff7e2475826ba29a71c3f496008988f.tar.bz2 libgats-1b797548dff7e2475826ba29a71c3f496008988f.tar.xz libgats-1b797548dff7e2475826ba29a71c3f496008988f.zip | |
libgats gets it's own repo.  The rest of the history is in my misc repo.
| -rw-r--r-- | default.bld | 62 | ||||
| -rw-r--r-- | src/boolean.cpp | 42 | ||||
| -rw-r--r-- | src/boolean.h | 27 | ||||
| -rw-r--r-- | src/dictionary.cpp | 145 | ||||
| -rw-r--r-- | src/dictionary.h | 44 | ||||
| -rw-r--r-- | src/float.cpp | 0 | ||||
| -rw-r--r-- | src/float.h | 0 | ||||
| -rw-r--r-- | src/gatsstream.cpp | 29 | ||||
| -rw-r--r-- | src/gatsstream.h | 24 | ||||
| -rw-r--r-- | src/integer.cpp | 27 | ||||
| -rw-r--r-- | src/integer.h | 78 | ||||
| -rw-r--r-- | src/list.cpp | 33 | ||||
| -rw-r--r-- | src/list.h | 22 | ||||
| -rw-r--r-- | src/object.cpp | 55 | ||||
| -rw-r--r-- | src/object.h | 39 | ||||
| -rw-r--r-- | src/packet.cpp | 10 | ||||
| -rw-r--r-- | src/packet.h | 29 | ||||
| -rw-r--r-- | src/string.cpp | 38 | ||||
| -rw-r--r-- | src/string.h | 26 | ||||
| -rw-r--r-- | src/tests/int.cpp | 21 | ||||
| -rw-r--r-- | src/unit/basic.unit | 122 | 
21 files changed, 873 insertions, 0 deletions
| diff --git a/default.bld b/default.bld new file mode 100644 index 0000000..ae6c61b --- /dev/null +++ b/default.bld | |||
| @@ -0,0 +1,62 @@ | |||
| 1 | |||
| 2 | action "default" | ||
| 3 | { | ||
| 4 | build: [targets("header-links"), "libgats.a"]; | ||
| 5 | } | ||
| 6 | |||
| 7 | action "all" | ||
| 8 | { | ||
| 9 | build: [targets("header-links"), "libgats.a", targets()]; | ||
| 10 | } | ||
| 11 | |||
| 12 | |||
| 13 | CXXFLAGS += "-ggdb -Wall"; | ||
| 14 | |||
| 15 | target files("src/*.h").replace("src/", "gats/") | ||
| 16 | { | ||
| 17 | tag "header-links"; | ||
| 18 | display "symlink"; | ||
| 19 | input OUTPUT.replace("gats/","src/"); | ||
| 20 | profile "build" | ||
| 21 | { | ||
| 22 | execute("ln -s ../${INPUT} ${OUTPUT}"); | ||
| 23 | } | ||
| 24 | } | ||
| 25 | |||
| 26 | target "libgats.a" | ||
| 27 | { | ||
| 28 | rule "lib"; | ||
| 29 | input files("src/*.cpp"); | ||
| 30 | CXXFLAGS += "-I. -Ilibbu++ -fPIC"; | ||
| 31 | } | ||
| 32 | |||
| 33 | target files("src/tests/*.cpp").replace("src/","").replace(".cpp","") | ||
| 34 | { | ||
| 35 | input "src/${OUTPUT}.cpp"; | ||
| 36 | rule "exe"; | ||
| 37 | tag ["tests", "general tests"]; | ||
| 38 | CXXFLAGS += "-I. -Ilibbu++"; | ||
| 39 | LDFLAGS += "-L. -lgats -Llibbu++ -lbu++"; | ||
| 40 | } | ||
| 41 | |||
| 42 | target files("src/unit/*.unit").replace("src/","").replace(".unit","") | ||
| 43 | { | ||
| 44 | input "src/${OUTPUT}.unit"; | ||
| 45 | rule "exe"; | ||
| 46 | requires "libbu++.a"; | ||
| 47 | tag ["tests", "unit tests"]; | ||
| 48 | CXXFLAGS += "-I."; | ||
| 49 | LDFLAGS += "-L. -lbu++ -lgats"; | ||
| 50 | } | ||
| 51 | |||
| 52 | rule "unit" | ||
| 53 | { | ||
| 54 | input "*.unit"; | ||
| 55 | output INPUT.replace(".unit", ".cpp"); | ||
| 56 | |||
| 57 | profile "build" | ||
| 58 | { | ||
| 59 | execute("../libbu++/mkunit \"${INPUT}\" \"${OUTPUT}\""); | ||
| 60 | } | ||
| 61 | } | ||
| 62 | |||
| diff --git a/src/boolean.cpp b/src/boolean.cpp new file mode 100644 index 0000000..087845a --- /dev/null +++ b/src/boolean.cpp | |||
| @@ -0,0 +1,42 @@ | |||
| 1 | #include "gats/boolean.h" | ||
| 2 | |||
| 3 | #include <bu/stream.h> | ||
| 4 | |||
| 5 | Gats::Boolean::Boolean() : | ||
| 6 | bVal( false ) | ||
| 7 | { | ||
| 8 | } | ||
| 9 | |||
| 10 | Gats::Boolean::Boolean( bool bVal ) : | ||
| 11 | bVal( bVal ) | ||
| 12 | { | ||
| 13 | } | ||
| 14 | |||
| 15 | Gats::Boolean::~Boolean() | ||
| 16 | { | ||
| 17 | } | ||
| 18 | |||
| 19 | void Gats::Boolean::write( Bu::Stream &rOut ) const | ||
| 20 | { | ||
| 21 | if( bVal ) | ||
| 22 | { | ||
| 23 | rOut.write("1", 1 ); | ||
| 24 | } | ||
| 25 | else | ||
| 26 | { | ||
| 27 | rOut.write("0", 1 ); | ||
| 28 | } | ||
| 29 | } | ||
| 30 | |||
| 31 | void Gats::Boolean::read( Bu::Stream &rIn, char cType ) | ||
| 32 | { | ||
| 33 | if( cType == '1' ) | ||
| 34 | { | ||
| 35 | bVal = true; | ||
| 36 | } | ||
| 37 | else | ||
| 38 | { | ||
| 39 | bVal = false; | ||
| 40 | } | ||
| 41 | } | ||
| 42 | |||
| diff --git a/src/boolean.h b/src/boolean.h new file mode 100644 index 0000000..3035b32 --- /dev/null +++ b/src/boolean.h | |||
| @@ -0,0 +1,27 @@ | |||
| 1 | #ifndef GATS_BOOLEAN_H | ||
| 2 | #define GATS_BOOLEAN_H | ||
| 3 | |||
| 4 | #include "gats/object.h" | ||
| 5 | |||
| 6 | namespace Gats | ||
| 7 | { | ||
| 8 | class Boolean : public Gats::Object | ||
| 9 | { | ||
| 10 | public: | ||
| 11 | Boolean(); | ||
| 12 | Boolean( bool bVal ); | ||
| 13 | virtual ~Boolean(); | ||
| 14 | |||
| 15 | virtual Type getType() const { return typeBoolean; } | ||
| 16 | bool getValue() const { return bVal; } | ||
| 17 | void setValue( bool b ) { bVal = b; } | ||
| 18 | |||
| 19 | virtual void write( Bu::Stream &rOut ) const; | ||
| 20 | virtual void read( Bu::Stream &rIn, char cType ); | ||
| 21 | |||
| 22 | private: | ||
| 23 | bool bVal; | ||
| 24 | }; | ||
| 25 | }; | ||
| 26 | |||
| 27 | #endif | ||
| diff --git a/src/dictionary.cpp b/src/dictionary.cpp new file mode 100644 index 0000000..385960f --- /dev/null +++ b/src/dictionary.cpp | |||
| @@ -0,0 +1,145 @@ | |||
| 1 | #include "gats/dictionary.h" | ||
| 2 | |||
| 3 | #include "gats/boolean.h" | ||
| 4 | #include "gats/integer.h" | ||
| 5 | #include "gats/float.h" | ||
| 6 | #include "gats/string.h" | ||
| 7 | #include "gats/list.h" | ||
| 8 | |||
| 9 | template<> | ||
| 10 | uint32_t Bu::__calcHashCode<Gats::String>( const Gats::String &s ) | ||
| 11 | { | ||
| 12 | return __calcHashCode( dynamic_cast<const Bu::FString &>(s) ); | ||
| 13 | } | ||
| 14 | |||
| 15 | Gats::Dictionary::Dictionary() | ||
| 16 | { | ||
| 17 | } | ||
| 18 | |||
| 19 | Gats::Dictionary::~Dictionary() | ||
| 20 | { | ||
| 21 | for( iterator i = begin(); i; i++ ) | ||
| 22 | { | ||
| 23 | delete *i; | ||
| 24 | } | ||
| 25 | } | ||
| 26 | |||
| 27 | void Gats::Dictionary::write( Bu::Stream &rOut ) const | ||
| 28 | { | ||
| 29 | rOut.write("d", 1 ); | ||
| 30 | for( const_iterator i= begin(); i; i++ ) | ||
| 31 | { | ||
| 32 | i.getKey().write( rOut ); | ||
| 33 | (*i)->write( rOut ); | ||
| 34 | } | ||
| 35 | rOut.write("e", 1 ); | ||
| 36 | } | ||
| 37 | |||
| 38 | void Gats::Dictionary::read( Bu::Stream &rIn, char cType ) | ||
| 39 | { | ||
| 40 | for(;;) | ||
| 41 | { | ||
| 42 | char cNext; | ||
| 43 | rIn.read( &cNext, 1 ); | ||
| 44 | if( cNext == 'e' ) | ||
| 45 | break; | ||
| 46 | if( cNext != 's' ) | ||
| 47 | throw Bu::ExceptionBase("You can only use strings as keys."); | ||
| 48 | Gats::String sKey; | ||
| 49 | sKey.read( rIn, cNext ); | ||
| 50 | |||
| 51 | ((Bu::Hash<Gats::String, Gats::Object *> *)this)->insert( | ||
| 52 | sKey, Gats::Object::read( rIn ) | ||
| 53 | ); | ||
| 54 | } | ||
| 55 | } | ||
| 56 | |||
| 57 | void Gats::Dictionary::insert( const Bu::FString &sKey, int64_t i ) | ||
| 58 | { | ||
| 59 | ((Bu::Hash<Gats::String, Gats::Object *> *)this)->insert( | ||
| 60 | sKey, new Gats::Integer( i ) | ||
| 61 | ); | ||
| 62 | } | ||
| 63 | |||
| 64 | void Gats::Dictionary::insert( const Bu::FString &sKey, bool b ) | ||
| 65 | { | ||
| 66 | Bu::Hash<Gats::String, Gats::Object *>::insert( | ||
| 67 | sKey, new Gats::Boolean( b ) | ||
| 68 | ); | ||
| 69 | } | ||
| 70 | |||
| 71 | void Gats::Dictionary::insert( const Bu::FString &sKey, double d ) | ||
| 72 | { | ||
| 73 | // Bu::Hash<Gats::String, Gats::Object *>::insert( | ||
| 74 | // sKey, new Gats::Float( d ) | ||
| 75 | // ); | ||
| 76 | } | ||
| 77 | |||
| 78 | void Gats::Dictionary::insert( const Bu::FString &sKey, const Bu::FString &s ) | ||
| 79 | { | ||
| 80 | Bu::Hash<Gats::String, Gats::Object *>::insert( | ||
| 81 | sKey, new Gats::String( s ) | ||
| 82 | ); | ||
| 83 | } | ||
| 84 | |||
| 85 | bool Gats::Dictionary::getBool( const Bu::FString &sKey ) | ||
| 86 | { | ||
| 87 | Gats::Boolean *pOb = dynamic_cast<Gats::Boolean *>( get( sKey ) ); | ||
| 88 | if( pOb ) | ||
| 89 | throw Bu::ExceptionBase("Cannot cast item '%s' to bool.", | ||
| 90 | sKey.getStr() ); | ||
| 91 | |||
| 92 | return pOb->getValue(); | ||
| 93 | } | ||
| 94 | |||
| 95 | int64_t Gats::Dictionary::getInt( const Bu::FString &sKey ) | ||
| 96 | { | ||
| 97 | Gats::Integer *pOb = dynamic_cast<Gats::Integer *>( get( sKey ) ); | ||
| 98 | if( pOb ) | ||
| 99 | throw Bu::ExceptionBase("Cannot cast item '%s' to int.", | ||
| 100 | sKey.getStr() ); | ||
| 101 | |||
| 102 | return pOb->getValue(); | ||
| 103 | } | ||
| 104 | |||
| 105 | double Gats::Dictionary::getFloat( const Bu::FString &sKey ) | ||
| 106 | {/* | ||
| 107 | Gats::Boolean *pOb = dynamic_cast<Gats::Boolean *>( get( sKey ) ); | ||
| 108 | if( pOb ) | ||
| 109 | throw Bu::ExceptionBase("Cannot cast item '%s' to bool.", | ||
| 110 | sKey.getStr() ); | ||
| 111 | |||
| 112 | return pOb->getValue();*/ | ||
| 113 | return 0.0; | ||
| 114 | } | ||
| 115 | |||
| 116 | Bu::FString Gats::Dictionary::getStr( const Bu::FString &sKey ) | ||
| 117 | { | ||
| 118 | Gats::String *pOb = dynamic_cast<Gats::String *>( get( sKey ) ); | ||
| 119 | if( pOb ) | ||
| 120 | throw Bu::ExceptionBase("Cannot cast item '%s' to string.", | ||
| 121 | sKey.getStr() ); | ||
| 122 | |||
| 123 | return *pOb; | ||
| 124 | } | ||
| 125 | |||
| 126 | Gats::List *Gats::Dictionary::getList( const Bu::FString &sKey ) | ||
| 127 | { | ||
| 128 | Gats::List *pOb = dynamic_cast<Gats::List *>( get( sKey ) ); | ||
| 129 | if( pOb ) | ||
| 130 | throw Bu::ExceptionBase("Cannot cast item '%s' to list.", | ||
| 131 | sKey.getStr() ); | ||
| 132 | |||
| 133 | return pOb; | ||
| 134 | } | ||
| 135 | |||
| 136 | Gats::Dictionary *Gats::Dictionary::getDict( const Bu::FString &sKey ) | ||
| 137 | { | ||
| 138 | Gats::Dictionary *pOb = dynamic_cast<Gats::Dictionary *>( get( sKey ) ); | ||
| 139 | if( pOb ) | ||
| 140 | throw Bu::ExceptionBase("Cannot cast item '%s' to dictionary.", | ||
| 141 | sKey.getStr() ); | ||
| 142 | |||
| 143 | return pOb; | ||
| 144 | } | ||
| 145 | |||
| diff --git a/src/dictionary.h b/src/dictionary.h new file mode 100644 index 0000000..3bcaec6 --- /dev/null +++ b/src/dictionary.h | |||
| @@ -0,0 +1,44 @@ | |||
| 1 | #ifndef GATS_DICTIONARY_H | ||
| 2 | #define GATS_DICTIONARY_H | ||
| 3 | |||
| 4 | #include "gats/object.h" | ||
| 5 | #include "gats/string.h" | ||
| 6 | #include <bu/hash.h> | ||
| 7 | |||
| 8 | namespace Gats | ||
| 9 | { | ||
| 10 | class List; | ||
| 11 | |||
| 12 | class Dictionary : public Gats::Object, | ||
| 13 | public Bu::Hash<Gats::String, Gats::Object *> | ||
| 14 | { | ||
| 15 | public: | ||
| 16 | Dictionary(); | ||
| 17 | virtual ~Dictionary(); | ||
| 18 | |||
| 19 | virtual Type getType() const { return typeDictionary; } | ||
| 20 | virtual void write( Bu::Stream &rOut ) const; | ||
| 21 | virtual void read( Bu::Stream &rIn, char cType ); | ||
| 22 | |||
| 23 | void insert( const Bu::FString &sKey, int64_t i ); | ||
| 24 | void insert( const Bu::FString &sKey, bool b ); | ||
| 25 | void insert( const Bu::FString &sKey, double d ); | ||
| 26 | void insert( const Bu::FString &sKey, const Bu::FString &s ); | ||
| 27 | using Bu::Hash<Gats::String, Gats::Object *>::insert; | ||
| 28 | |||
| 29 | bool getBool( const Bu::FString &sKey ); | ||
| 30 | int64_t getInt( const Bu::FString &sKey ); | ||
| 31 | double getFloat( const Bu::FString &sKey ); | ||
| 32 | Bu::FString getStr( const Bu::FString &sKey ); | ||
| 33 | Gats::List *getList( const Bu::FString &sKey ); | ||
| 34 | Gats::Dictionary *getDict( const Bu::FString &sKey ); | ||
| 35 | }; | ||
| 36 | }; | ||
| 37 | |||
| 38 | namespace Bu | ||
| 39 | { | ||
| 40 | template<> | ||
| 41 | uint32_t __calcHashCode<Gats::String>( const Gats::String &s ); | ||
| 42 | }; | ||
| 43 | |||
| 44 | #endif | ||
| diff --git a/src/float.cpp b/src/float.cpp new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/src/float.cpp | |||
| diff --git a/src/float.h b/src/float.h new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/src/float.h | |||
| diff --git a/src/gatsstream.cpp b/src/gatsstream.cpp new file mode 100644 index 0000000..4b9cadf --- /dev/null +++ b/src/gatsstream.cpp | |||
| @@ -0,0 +1,29 @@ | |||
| 1 | #include "gats/gatsstream.h" | ||
| 2 | #include "gats/object.h" | ||
| 3 | |||
| 4 | #include <bu/sio.h> | ||
| 5 | #include <bu/nullstream.h> | ||
| 6 | using namespace Bu; | ||
| 7 | |||
| 8 | Gats::GatsStream::GatsStream( Bu::Stream &rStream ) : | ||
| 9 | rStream( rStream ) | ||
| 10 | { | ||
| 11 | } | ||
| 12 | |||
| 13 | Gats::GatsStream::~GatsStream() | ||
| 14 | { | ||
| 15 | } | ||
| 16 | |||
| 17 | Gats::Object *Gats::GatsStream::readObject() | ||
| 18 | { | ||
| 19 | |||
| 20 | } | ||
| 21 | |||
| 22 | void Gats::GatsStream::writeObject( Gats::Object *pObject ) | ||
| 23 | { | ||
| 24 | Bu::NullStream ns; | ||
| 25 | pObject->write( ns ); | ||
| 26 | |||
| 27 | sio << "Object consumed " << ns.tell() << "b." << sio.nl; | ||
| 28 | } | ||
| 29 | |||
| diff --git a/src/gatsstream.h b/src/gatsstream.h new file mode 100644 index 0000000..d668c28 --- /dev/null +++ b/src/gatsstream.h | |||
| @@ -0,0 +1,24 @@ | |||
| 1 | #ifndef GATS_STREAM_H | ||
| 2 | #define GATS_STREAM_H | ||
| 3 | |||
| 4 | #include <bu/stream.h> | ||
| 5 | |||
| 6 | namespace Gats | ||
| 7 | { | ||
| 8 | class Object; | ||
| 9 | |||
| 10 | class GatsStream | ||
| 11 | { | ||
| 12 | public: | ||
| 13 | GatsStream( Bu::Stream &rStream ); | ||
| 14 | virtual ~GatsStream(); | ||
| 15 | |||
| 16 | Gats::Object *readObject(); | ||
| 17 | void writeObject( Gats::Object *pObject ); | ||
| 18 | |||
| 19 | private: | ||
| 20 | Bu::Stream &rStream; | ||
| 21 | }; | ||
| 22 | }; | ||
| 23 | |||
| 24 | #endif | ||
| diff --git a/src/integer.cpp b/src/integer.cpp new file mode 100644 index 0000000..ad48eaf --- /dev/null +++ b/src/integer.cpp | |||
| @@ -0,0 +1,27 @@ | |||
| 1 | #include "gats/integer.h" | ||
| 2 | |||
| 3 | Gats::Integer::Integer() : | ||
| 4 | iVal( 0 ) | ||
| 5 | { | ||
| 6 | } | ||
| 7 | |||
| 8 | Gats::Integer::Integer( int64_t iVal ) : | ||
| 9 | iVal( iVal ) | ||
| 10 | { | ||
| 11 | } | ||
| 12 | |||
| 13 | Gats::Integer::~Integer() | ||
| 14 | { | ||
| 15 | } | ||
| 16 | |||
| 17 | void Gats::Integer::write( Bu::Stream &rOut ) const | ||
| 18 | { | ||
| 19 | rOut.write("i", 1 ); | ||
| 20 | writePackedInt( rOut, iVal ); | ||
| 21 | } | ||
| 22 | |||
| 23 | void Gats::Integer::read( Bu::Stream &rIn, char cType ) | ||
| 24 | { | ||
| 25 | readPackedInt( rIn, iVal ); | ||
| 26 | } | ||
| 27 | |||
| diff --git a/src/integer.h b/src/integer.h new file mode 100644 index 0000000..6ed7c49 --- /dev/null +++ b/src/integer.h | |||
| @@ -0,0 +1,78 @@ | |||
| 1 | #ifndef GATS_INTEGER_H | ||
| 2 | #define GATS_INTEGER_H | ||
| 3 | |||
| 4 | #include "gats/object.h" | ||
| 5 | |||
| 6 | #include <stdint.h> | ||
| 7 | |||
| 8 | #include <bu/stream.h> | ||
| 9 | |||
| 10 | namespace Gats | ||
| 11 | { | ||
| 12 | class Integer : public Gats::Object | ||
| 13 | { | ||
| 14 | public: | ||
| 15 | Integer(); | ||
| 16 | Integer( int64_t iVal ); | ||
| 17 | virtual ~Integer(); | ||
| 18 | |||
| 19 | virtual Type getType() const { return typeInteger; } | ||
| 20 | int64_t getValue() const { return iVal; } | ||
| 21 | |||
| 22 | virtual void write( Bu::Stream &rOut ) const; | ||
| 23 | virtual void read( Bu::Stream &rIn, char cType ); | ||
| 24 | |||
| 25 | template<typename itype> | ||
| 26 | static void readPackedInt( Bu::Stream &rStream, itype &rOut ) | ||
| 27 | { | ||
| 28 | int8_t b; | ||
| 29 | rOut = 0; | ||
| 30 | bool bNeg; | ||
| 31 | |||
| 32 | rStream.read( &b, 1 ); | ||
| 33 | bNeg = ( b&0x40 ); | ||
| 34 | rOut |= (itype(b&0x3F)); | ||
| 35 | int c = 0; | ||
| 36 | while( (b&0x80) ) | ||
| 37 | { | ||
| 38 | rStream.read( &b, 1 ); | ||
| 39 | rOut |= (itype(b&0x7F)) << (6+7*(c++)); | ||
| 40 | } | ||
| 41 | if( bNeg ) rOut = -rOut; | ||
| 42 | } | ||
| 43 | |||
| 44 | template<typename itype> | ||
| 45 | static void writePackedInt( Bu::Stream &rStream, itype iIn ) | ||
| 46 | { | ||
| 47 | uint8_t b; | ||
| 48 | |||
| 49 | if( iIn < 0 ) | ||
| 50 | { | ||
| 51 | iIn = -iIn; | ||
| 52 | b = (iIn&0x3F) | 0x40; | ||
| 53 | } | ||
| 54 | else | ||
| 55 | { | ||
| 56 | b = (iIn&0x3F); | ||
| 57 | } | ||
| 58 | if( iIn > b ) | ||
| 59 | b |= 0x80; | ||
| 60 | rStream.write( &b, 1 ); | ||
| 61 | iIn = iIn >> 6; | ||
| 62 | |||
| 63 | while( iIn ) | ||
| 64 | { | ||
| 65 | b = (iIn&0x7F); | ||
| 66 | if( iIn > b ) | ||
| 67 | b |= 0x80; | ||
| 68 | rStream.write( &b, 1 ); | ||
| 69 | iIn = iIn >> 7; | ||
| 70 | } | ||
| 71 | } | ||
| 72 | |||
| 73 | private: | ||
| 74 | int64_t iVal; | ||
| 75 | }; | ||
| 76 | }; | ||
| 77 | |||
| 78 | #endif | ||
| diff --git a/src/list.cpp b/src/list.cpp new file mode 100644 index 0000000..995a764 --- /dev/null +++ b/src/list.cpp | |||
| @@ -0,0 +1,33 @@ | |||
| 1 | #include "gats/list.h" | ||
| 2 | |||
| 3 | #include <bu/stream.h> | ||
| 4 | |||
| 5 | Gats::List::List() | ||
| 6 | { | ||
| 7 | } | ||
| 8 | |||
| 9 | Gats::List::~List() | ||
| 10 | { | ||
| 11 | } | ||
| 12 | |||
| 13 | void Gats::List::write( Bu::Stream &rOut ) const | ||
| 14 | { | ||
| 15 | rOut.write("l", 1 ); | ||
| 16 | for( const_iterator i = begin(); i; i++ ) | ||
| 17 | { | ||
| 18 | (*i)->write( rOut ); | ||
| 19 | } | ||
| 20 | rOut.write("e", 1 ); | ||
| 21 | } | ||
| 22 | |||
| 23 | void Gats::List::read( Bu::Stream &rIn, char cType ) | ||
| 24 | { | ||
| 25 | for(;;) | ||
| 26 | { | ||
| 27 | Gats::Object *pObj = Gats::Object::read( rIn ); | ||
| 28 | if( pObj == NULL ) | ||
| 29 | break; | ||
| 30 | append( pObj ); | ||
| 31 | } | ||
| 32 | } | ||
| 33 | |||
| diff --git a/src/list.h b/src/list.h new file mode 100644 index 0000000..48faf23 --- /dev/null +++ b/src/list.h | |||
| @@ -0,0 +1,22 @@ | |||
| 1 | #ifndef GATS_LIST_H | ||
| 2 | #define GATS_LIST_H | ||
| 3 | |||
| 4 | #include "gats/object.h" | ||
| 5 | #include <bu/list.h> | ||
| 6 | |||
| 7 | namespace Gats | ||
| 8 | { | ||
| 9 | class List : public Gats::Object, public Bu::List<Gats::Object *> | ||
| 10 | { | ||
| 11 | public: | ||
| 12 | List(); | ||
| 13 | virtual ~List(); | ||
| 14 | |||
| 15 | virtual Type getType() const { return typeList; } | ||
| 16 | |||
| 17 | virtual void write( Bu::Stream &rOut ) const; | ||
| 18 | virtual void read( Bu::Stream &rIn, char cType ); | ||
| 19 | }; | ||
| 20 | }; | ||
| 21 | |||
| 22 | #endif | ||
| diff --git a/src/object.cpp b/src/object.cpp new file mode 100644 index 0000000..3d7765e --- /dev/null +++ b/src/object.cpp | |||
| @@ -0,0 +1,55 @@ | |||
| 1 | #include "gats/object.h" | ||
| 2 | |||
| 3 | #include "gats/integer.h" | ||
| 4 | #include "gats/float.h" | ||
| 5 | #include "gats/boolean.h" | ||
| 6 | #include "gats/string.h" | ||
| 7 | #include "gats/list.h" | ||
| 8 | #include "gats/dictionary.h" | ||
| 9 | |||
| 10 | #include <bu/stream.h> | ||
| 11 | |||
| 12 | Gats::Object::Object() | ||
| 13 | { | ||
| 14 | } | ||
| 15 | |||
| 16 | Gats::Object::~Object() | ||
| 17 | { | ||
| 18 | } | ||
| 19 | |||
| 20 | Gats::Object *Gats::Object::read( Bu::Stream &rIn ) | ||
| 21 | { | ||
| 22 | char buf; | ||
| 23 | rIn.read( &buf, 1 ); | ||
| 24 | Object *pObj = NULL; | ||
| 25 | switch( buf ) | ||
| 26 | { | ||
| 27 | case 'i': | ||
| 28 | pObj = new Gats::Integer(); | ||
| 29 | break; | ||
| 30 | |||
| 31 | case 's': | ||
| 32 | pObj = new Gats::String(); | ||
| 33 | break; | ||
| 34 | |||
| 35 | case '0': | ||
| 36 | case '1': | ||
| 37 | pObj = new Gats::Boolean(); | ||
| 38 | break; | ||
| 39 | |||
| 40 | case 'l': | ||
| 41 | pObj = new Gats::List(); | ||
| 42 | break; | ||
| 43 | |||
| 44 | case 'e': | ||
| 45 | return NULL; | ||
| 46 | |||
| 47 | default: | ||
| 48 | throw Bu::ExceptionBase("Invalid Gats type discovered: %c.", buf ); | ||
| 49 | } | ||
| 50 | |||
| 51 | pObj->read( rIn, buf ); | ||
| 52 | |||
| 53 | return pObj; | ||
| 54 | } | ||
| 55 | |||
| diff --git a/src/object.h b/src/object.h new file mode 100644 index 0000000..10bdc47 --- /dev/null +++ b/src/object.h | |||
| @@ -0,0 +1,39 @@ | |||
| 1 | #ifndef GATS_OBJECT_H | ||
| 2 | #define GATS_OBJECT_H | ||
| 3 | |||
| 4 | namespace Bu | ||
| 5 | { | ||
| 6 | class Stream; | ||
| 7 | }; | ||
| 8 | |||
| 9 | namespace Gats | ||
| 10 | { | ||
| 11 | enum Type | ||
| 12 | { | ||
| 13 | typeDictionary, | ||
| 14 | typeList, | ||
| 15 | typeString, | ||
| 16 | typeInteger, | ||
| 17 | typeFloat, | ||
| 18 | typeBoolean | ||
| 19 | }; | ||
| 20 | |||
| 21 | /** | ||
| 22 | * The baseclass for every type that can be stored in a packet. | ||
| 23 | */ | ||
| 24 | class Object | ||
| 25 | { | ||
| 26 | public: | ||
| 27 | Object(); | ||
| 28 | virtual ~Object(); | ||
| 29 | |||
| 30 | virtual Type getType() const =0; | ||
| 31 | |||
| 32 | virtual void write( Bu::Stream &rOut ) const=0; | ||
| 33 | virtual void read( Bu::Stream &rIn, char cType )=0; | ||
| 34 | |||
| 35 | static Object *read( Bu::Stream &rIn ); | ||
| 36 | }; | ||
| 37 | }; | ||
| 38 | |||
| 39 | #endif | ||
| diff --git a/src/packet.cpp b/src/packet.cpp new file mode 100644 index 0000000..6283ce5 --- /dev/null +++ b/src/packet.cpp | |||
| @@ -0,0 +1,10 @@ | |||
| 1 | #include "gats/packet.h" | ||
| 2 | |||
| 3 | Gats::Packet::Packet() | ||
| 4 | { | ||
| 5 | } | ||
| 6 | |||
| 7 | Gats::Packet::~Packet() | ||
| 8 | { | ||
| 9 | } | ||
| 10 | |||
| diff --git a/src/packet.h b/src/packet.h new file mode 100644 index 0000000..5ddc9ee --- /dev/null +++ b/src/packet.h | |||
| @@ -0,0 +1,29 @@ | |||
| 1 | #ifndef GATS_PACKET_H | ||
| 2 | #define GATS_PACKET_H | ||
| 3 | |||
| 4 | namespace Gats | ||
| 5 | { | ||
| 6 | class Object; | ||
| 7 | |||
| 8 | /** | ||
| 9 | * A D-encoded packet is a header and metadata related to encoding as well | ||
| 10 | * as a single object. The advantage of this method is that the packet | ||
| 11 | * contains all information related to encoding and is highly portable, it | ||
| 12 | * also lets the reader know how much data to expect, which makes this | ||
| 13 | * efficient for use in protocols and embedding in other data streams. | ||
| 14 | */ | ||
| 15 | class Packet | ||
| 16 | { | ||
| 17 | public: | ||
| 18 | Packet(); | ||
| 19 | Packet( Object *pObject ); | ||
| 20 | virtual ~Packet(); | ||
| 21 | |||
| 22 | Object *getObject() { return pRoot; } | ||
| 23 | |||
| 24 | private: | ||
| 25 | Object *pRoot; | ||
| 26 | }; | ||
| 27 | }; | ||
| 28 | |||
| 29 | #endif | ||
| diff --git a/src/string.cpp b/src/string.cpp new file mode 100644 index 0000000..416375d --- /dev/null +++ b/src/string.cpp | |||
| @@ -0,0 +1,38 @@ | |||
| 1 | #include "gats/string.h" | ||
| 2 | |||
| 3 | #include "gats/integer.h" | ||
| 4 | |||
| 5 | Gats::String::String() | ||
| 6 | { | ||
| 7 | } | ||
| 8 | |||
| 9 | Gats::String::String( const String &s ) : | ||
| 10 | Bu::FString( s ) | ||
| 11 | { | ||
| 12 | } | ||
| 13 | |||
| 14 | Gats::String::String( const Bu::FString &s ) : | ||
| 15 | Bu::FString( s ) | ||
| 16 | { | ||
| 17 | } | ||
| 18 | |||
| 19 | Gats::String::~String() | ||
| 20 | { | ||
| 21 | } | ||
| 22 | |||
| 23 | void Gats::String::write( Bu::Stream &rOut ) const | ||
| 24 | { | ||
| 25 | rOut.write("s", 1 ); | ||
| 26 | uint32_t iSize = getSize(); | ||
| 27 | Gats::Integer::writePackedInt( rOut, iSize ); | ||
| 28 | rOut.write( getStr(), iSize ); | ||
| 29 | } | ||
| 30 | |||
| 31 | void Gats::String::read( Bu::Stream &rIn, char cType ) | ||
| 32 | { | ||
| 33 | uint32_t iSize; | ||
| 34 | Gats::Integer::readPackedInt( rIn, iSize ); | ||
| 35 | setSize( iSize ); | ||
| 36 | rIn.read( getStr(), iSize ); | ||
| 37 | } | ||
| 38 | |||
| diff --git a/src/string.h b/src/string.h new file mode 100644 index 0000000..5343ba8 --- /dev/null +++ b/src/string.h | |||
| @@ -0,0 +1,26 @@ | |||
| 1 | #ifndef GATS_STRING_H | ||
| 2 | #define GATS_STRING_H | ||
| 3 | |||
| 4 | #include "gats/object.h" | ||
| 5 | #include <bu/fstring.h> | ||
| 6 | |||
| 7 | namespace Gats | ||
| 8 | { | ||
| 9 | class String : public Gats::Object, public Bu::FString | ||
| 10 | { | ||
| 11 | public: | ||
| 12 | String(); | ||
| 13 | String( const String &s ); | ||
| 14 | String( const Bu::FString &s ); | ||
| 15 | virtual ~String(); | ||
| 16 | |||
| 17 | virtual Type getType() const { return typeString; } | ||
| 18 | |||
| 19 | virtual void write( Bu::Stream &rOut ) const; | ||
| 20 | virtual void read( Bu::Stream &rIn, char cType ); | ||
| 21 | |||
| 22 | private: | ||
| 23 | }; | ||
| 24 | }; | ||
| 25 | |||
| 26 | #endif | ||
| diff --git a/src/tests/int.cpp b/src/tests/int.cpp new file mode 100644 index 0000000..5d5b7d2 --- /dev/null +++ b/src/tests/int.cpp | |||
| @@ -0,0 +1,21 @@ | |||
| 1 | #include "gats/integer.h" | ||
| 2 | |||
| 3 | #include <bu/sio.h> | ||
| 4 | #include <bu/membuf.h> | ||
| 5 | |||
| 6 | using namespace Bu; | ||
| 7 | |||
| 8 | int main() | ||
| 9 | { | ||
| 10 | MemBuf mb; | ||
| 11 | int64_t i = -53954321995838ll; | ||
| 12 | |||
| 13 | sio << "Before: " << i << sio.nl; | ||
| 14 | Gats::Integer::writePackedInt( mb, i ); | ||
| 15 | mb.setPos( 0 ); | ||
| 16 | Gats::Integer::readPackedInt( mb, i ); | ||
| 17 | sio << "After: " << i << sio.nl; | ||
| 18 | |||
| 19 | return 0; | ||
| 20 | } | ||
| 21 | |||
| diff --git a/src/unit/basic.unit b/src/unit/basic.unit new file mode 100644 index 0000000..9389c70 --- /dev/null +++ b/src/unit/basic.unit | |||
| @@ -0,0 +1,122 @@ | |||
| 1 | // vim: syntax=cpp | ||
| 2 | /* | ||
| 3 | * Copyright (C) 2007-2010 Xagasoft, All rights reserved. | ||
| 4 | * | ||
| 5 | * This file is part of the libbu++ library and is released under the | ||
| 6 | * terms of the license contained in the file LICENSE. | ||
| 7 | */ | ||
| 8 | |||
| 9 | #include "gats/dictionary.h" | ||
| 10 | #include "gats/integer.h" | ||
| 11 | #include "gats/float.h" | ||
| 12 | #include "gats/list.h" | ||
| 13 | #include "gats/boolean.h" | ||
| 14 | #include "gats/string.h" | ||
| 15 | |||
| 16 | #include "bu/membuf.h" | ||
| 17 | #include "bu/list.h" | ||
| 18 | #include "bu/sio.h" | ||
| 19 | |||
| 20 | #include <stdlib.h> | ||
| 21 | |||
| 22 | using namespace Bu; | ||
| 23 | |||
| 24 | suite Basic | ||
| 25 | { | ||
| 26 | test integer | ||
| 27 | { | ||
| 28 | Bu::List<int64_t> lInts; | ||
| 29 | Bu::MemBuf mb; | ||
| 30 | |||
| 31 | int64_t i = 1; | ||
| 32 | for( int x = 0; x < 256; x++ ) | ||
| 33 | { | ||
| 34 | lInts.append( i ); | ||
| 35 | Gats::Integer( i ).write( mb ); | ||
| 36 | i = -(i<<1)-i; | ||
| 37 | } | ||
| 38 | |||
| 39 | mb.setPos( 0 ); | ||
| 40 | |||
| 41 | for( Bu::List<int64_t>::iterator j = lInts.begin(); j; j++ ) | ||
| 42 | { | ||
| 43 | Gats::Object *pObj = Gats::Object::read( mb ); | ||
| 44 | if( pObj->getType() != Gats::typeInteger ) | ||
| 45 | unitFailed("Bad type read."); | ||
| 46 | |||
| 47 | if( dynamic_cast<Gats::Integer *>(pObj)->getValue() != *j ) | ||
| 48 | unitFailed("Bad number."); | ||
| 49 | } | ||
| 50 | } | ||
| 51 | |||
| 52 | test string | ||
| 53 | { | ||
| 54 | Bu::List<Bu::FString> lStrs; | ||
| 55 | Bu::MemBuf mb; | ||
| 56 | |||
| 57 | lStrs.append( Bu::FString() ); | ||
| 58 | Gats::String("").write( mb ); | ||
| 59 | |||
| 60 | { | ||
| 61 | int iMax = 0; | ||
| 62 | for( int j = 1; j <= (1<<16); j=j<<1 ) | ||
| 63 | iMax += j; | ||
| 64 | setStepCount( iMax ); | ||
| 65 | } | ||
| 66 | for( int j = 1; j <= (1<<16); j=j<<1 ) | ||
| 67 | { | ||
| 68 | Bu::FString s( j ); | ||
| 69 | for( int x = 0; x < j; x++ ) | ||
| 70 | { | ||
| 71 | s[x] = (unsigned char)(random()%256); | ||
| 72 | } | ||
| 73 | incProgress( j ); | ||
| 74 | Gats::String( s ).write( mb ); | ||
| 75 | lStrs.append( s ); | ||
| 76 | } | ||
| 77 | |||
| 78 | mb.setPos( 0 ); | ||
| 79 | |||
| 80 | for( Bu::List<Bu::FString>::iterator i = lStrs.begin(); i; i++ ) | ||
| 81 | { | ||
| 82 | Gats::Object *pObj = Gats::Object::read( mb ); | ||
| 83 | if( pObj->getType() != Gats::typeString ) | ||
| 84 | unitFailed("Bad type read."); | ||
| 85 | |||
| 86 | if( *dynamic_cast<Gats::String *>(pObj) != *i ) | ||
| 87 | unitFailed("Bad string."); | ||
| 88 | } | ||
| 89 | } | ||
| 90 | |||
| 91 | test boolean | ||
| 92 | { | ||
| 93 | Bu::List<bool> lBs; | ||
| 94 | Bu::MemBuf mb; | ||
| 95 | |||
| 96 | for( int j = 0; j < 1024; j++ ) | ||
| 97 | { | ||
| 98 | if( random()%2 == 0 ) | ||
| 99 | { | ||
| 100 | lBs.append( true ); | ||
| 101 | Gats::Boolean( true ).write( mb ); | ||
| 102 | } | ||
| 103 | else | ||
| 104 | { | ||
| 105 | lBs.append( false ); | ||
| 106 | Gats::Boolean( false ).write( mb ); | ||
| 107 | } | ||
| 108 | } | ||
| 109 | |||
| 110 | mb.setPos( 0 ); | ||
| 111 | |||
| 112 | for( Bu::List<bool>::iterator i = lBs.begin(); i; i++ ) | ||
| 113 | { | ||
| 114 | Gats::Object *pObj = Gats::Object::read( mb ); | ||
| 115 | if( pObj->getType() != Gats::typeBoolean ) | ||
| 116 | unitFailed("Bad type read."); | ||
| 117 | |||
| 118 | if( dynamic_cast<Gats::Boolean *>(pObj)->getValue() != *i ) | ||
| 119 | unitFailed("Bad string."); | ||
| 120 | } | ||
| 121 | } | ||
| 122 | } | ||
