diff options
-rw-r--r-- | pymake.tests.conf | 54 | ||||
-rw-r--r-- | src/hash.cpp | 1 | ||||
-rw-r--r-- | src/hash.h | 106 | ||||
-rw-r--r-- | src/hashable.cpp | 1 | ||||
-rw-r--r-- | src/hashable.h | 10 | ||||
-rw-r--r-- | src/staticstring.cpp | 25 | ||||
-rw-r--r-- | src/staticstring.h | 11 | ||||
-rw-r--r-- | src/test/exception/exception.cpp | 8 | ||||
-rw-r--r-- | src/test/hash/main.cpp | 10 |
9 files changed, 219 insertions, 7 deletions
diff --git a/pymake.tests.conf b/pymake.tests.conf new file mode 100644 index 0000000..d5719d4 --- /dev/null +++ b/pymake.tests.conf | |||
@@ -0,0 +1,54 @@ | |||
1 | ### pymake by ~3o~ph()g (neonphog.com) ### | ||
2 | ## This skeleton file was generated by pymake... please edit for your project. | ||
3 | |||
4 | CXXFLAGS: -ggdb -fPIC | ||
5 | LDFLAGS: -ggdb | ||
6 | |||
7 | #[BUILD] | ||
8 | #DIR: src | ||
9 | #COMMAND: lib | ||
10 | #OUTPUT: libbu++.a | ||
11 | |||
12 | # | ||
13 | # Uncomment this if you want to build the tests, these don't rely on anything | ||
14 | # that libbu++ doesn't rely on. | ||
15 | # | ||
16 | [DIRBUILD] | ||
17 | COMMAND: exe | ||
18 | OUTPUT: tests/{NAME} | ||
19 | ROOT: src/test | ||
20 | LDFLAGS: -L. -lbu++ | ||
21 | CXXFLAGS: -Isrc -Isrc/test | ||
22 | |||
23 | [OVERRIDE] | ||
24 | FILE: tests/plugin | ||
25 | LDFLAGS: -ldl | ||
26 | |||
27 | # | ||
28 | # Uncomment this if you have cpptest and want to build the unit tests | ||
29 | # | ||
30 | #[DIRBUILD] | ||
31 | #COMMAND: exe | ||
32 | #OUTPUT: unit/{NAME} | ||
33 | #ROOT: src/unit | ||
34 | #LDFLAGS: -L. -lbu++ -lcpptest | ||
35 | #CXXFLAGS: -Isrc | ||
36 | |||
37 | [TRIGGER] | ||
38 | INPUT: .cpp #take input of *.cpp files | ||
39 | OUTPUT: .o #output .o files | ||
40 | COMMAND: g++ -fPIC -c {INPUT} {CXXFLAGS} -I{DIR} -o {OUTPUT} | ||
41 | CHECK: g++ -M {INPUT} {CXXFLAGS} -I{DIR} | ||
42 | |||
43 | ### Executable command ### | ||
44 | ## Use this command if you want a simple executable | ||
45 | [COMMAND] | ||
46 | NAME: exe | ||
47 | COMMAND: g++ {INPUT} {LDFLAGS} -o {OUTPUT} | ||
48 | |||
49 | ### Library command ### | ||
50 | ## Use this command if you wish to create a library | ||
51 | [COMMAND] | ||
52 | NAME: lib | ||
53 | COMMAND: ar cr{ARFLAGS} {OUTPUT} {INPUT} | ||
54 | |||
diff --git a/src/hash.cpp b/src/hash.cpp new file mode 100644 index 0000000..b4aac77 --- /dev/null +++ b/src/hash.cpp | |||
@@ -0,0 +1 @@ | |||
#include "hash.h" | |||
diff --git a/src/hash.h b/src/hash.h new file mode 100644 index 0000000..8385bb9 --- /dev/null +++ b/src/hash.h | |||
@@ -0,0 +1,106 @@ | |||
1 | #ifndef HASH_H | ||
2 | #define HASH_H | ||
3 | /* | ||
4 | #include <stddef.h> | ||
5 | #include <string.h> | ||
6 | #include "hashable.h" | ||
7 | |||
8 | #define bitsToBytes( n ) (n/8+(n%8>0 ? 1 : 0)) | ||
9 | |||
10 | template<class key, class value> | ||
11 | class Hash | ||
12 | { | ||
13 | class iterator | ||
14 | { | ||
15 | friend class Hash<key, value>; | ||
16 | private: | ||
17 | iterator( Hash<key, value> *hsh, int nIndex, key keyval, bool bInsert ) : | ||
18 | hsh( hsh ), | ||
19 | nIndex( nIndex ), | ||
20 | keyval( keyval ), | ||
21 | bInsert( bInsert ) | ||
22 | { | ||
23 | } | ||
24 | |||
25 | public: | ||
26 | iterator() : | ||
27 | hsh( NULL ), | ||
28 | nIndex( -1 ) | ||
29 | { | ||
30 | } | ||
31 | |||
32 | iterator &operator=( iterator &src ) | ||
33 | { | ||
34 | this->hsh = src.hsh; | ||
35 | this->nIndex = src.nIndex; | ||
36 | } | ||
37 | |||
38 | iterator &operator=( value &src ) | ||
39 | { | ||
40 | if( bInsert ) | ||
41 | printf("You wanted to insert %d\n", src ); | ||
42 | else | ||
43 | printf("You wanted to insert %d\n", src ); | ||
44 | } | ||
45 | |||
46 | private: | ||
47 | Hash<key, value> *hsh; | ||
48 | int nIndex; | ||
49 | bool bInsert; | ||
50 | key keyval; | ||
51 | }; | ||
52 | |||
53 | template<class refval> | ||
54 | class VRef | ||
55 | { | ||
56 | public: | ||
57 | VRef( refval &data ) : | ||
58 | data( data ) | ||
59 | { | ||
60 | } | ||
61 | refval &data; | ||
62 | }; | ||
63 | |||
64 | public: | ||
65 | Hash() : | ||
66 | nCapacity( 11 ), | ||
67 | nFilled( 0 ), | ||
68 | bFilled( NULL ), | ||
69 | aKeys( NULL ), | ||
70 | aValues( NULL ), | ||
71 | aHashCodes( NULL ) | ||
72 | { | ||
73 | int nKeysSize = bitsToBytes( nCapacity ); | ||
74 | bFilled = new unsigned char[ nKeysSize ]; | ||
75 | memset( bFilled, 0, nKeysSize ); | ||
76 | |||
77 | aKeys = new VRef<key>*[nCapacity]; | ||
78 | aValues = new value[nCapacity]; | ||
79 | } | ||
80 | |||
81 | virtual ~Hash() | ||
82 | { | ||
83 | } | ||
84 | |||
85 | iterator operator[]( key keyval ) | ||
86 | { | ||
87 | //iterator i( this, 4, keyval, true ); | ||
88 | //return i; | ||
89 | printf("%s\n", keyval.getString() ); | ||
90 | } | ||
91 | |||
92 | int hasKey( key keyval ) | ||
93 | { | ||
94 | printf("%s\n", keyval.getString() ); | ||
95 | } | ||
96 | |||
97 | private: | ||
98 | int nCapacity; | ||
99 | int nFilled; | ||
100 | unsigned char *bFilled; | ||
101 | VRef<key> **aKeys; | ||
102 | unsigned long int *aHashCodes; | ||
103 | value *aValues; | ||
104 | }; | ||
105 | */ | ||
106 | #endif | ||
diff --git a/src/hashable.cpp b/src/hashable.cpp new file mode 100644 index 0000000..8565956 --- /dev/null +++ b/src/hashable.cpp | |||
@@ -0,0 +1 @@ | |||
#include "hashable.h" | |||
diff --git a/src/hashable.h b/src/hashable.h new file mode 100644 index 0000000..33ff8b8 --- /dev/null +++ b/src/hashable.h | |||
@@ -0,0 +1,10 @@ | |||
1 | #ifndef HASHABLE_H | ||
2 | #define HASHABLE_H | ||
3 | /* | ||
4 | class Hashable | ||
5 | { | ||
6 | public: | ||
7 | virtual unsigned long int getHashCode() = 0; | ||
8 | }; | ||
9 | */ | ||
10 | #endif | ||
diff --git a/src/staticstring.cpp b/src/staticstring.cpp index fa61e62..9eac92e 100644 --- a/src/staticstring.cpp +++ b/src/staticstring.cpp | |||
@@ -25,6 +25,13 @@ StaticString::StaticString( const char *lpNewStr, int nNewLen ) | |||
25 | setString( lpNewStr, nNewLen ); | 25 | setString( lpNewStr, nNewLen ); |
26 | } | 26 | } |
27 | 27 | ||
28 | StaticString::StaticString( const char *lpNewStr ) | ||
29 | { | ||
30 | lpStr = NULL; | ||
31 | nLen = 0; | ||
32 | setString( lpNewStr, -1 ); | ||
33 | } | ||
34 | |||
28 | StaticString::StaticString( StaticString &xSrcStr, int nNewLen ) | 35 | StaticString::StaticString( StaticString &xSrcStr, int nNewLen ) |
29 | { | 36 | { |
30 | lpStr = NULL; | 37 | lpStr = NULL; |
@@ -32,6 +39,13 @@ StaticString::StaticString( StaticString &xSrcStr, int nNewLen ) | |||
32 | setString( xSrcStr, nNewLen ); | 39 | setString( xSrcStr, nNewLen ); |
33 | } | 40 | } |
34 | 41 | ||
42 | StaticString::StaticString( StaticString &xSrcStr ) | ||
43 | { | ||
44 | lpStr = NULL; | ||
45 | nLen = 0; | ||
46 | setString( xSrcStr, -1 ); | ||
47 | } | ||
48 | |||
35 | StaticString::~StaticString() | 49 | StaticString::~StaticString() |
36 | { | 50 | { |
37 | if( lpStr != NULL ) delete[] lpStr; | 51 | if( lpStr != NULL ) delete[] lpStr; |
@@ -225,3 +239,14 @@ bool StaticString::operator!=( StaticString &str ) | |||
225 | for(; *a == *b; a++, b++ ) if( *a == '\0' && *b == '\0' ) return false; | 239 | for(; *a == *b; a++, b++ ) if( *a == '\0' && *b == '\0' ) return false; |
226 | return true; | 240 | return true; |
227 | } | 241 | } |
242 | |||
243 | unsigned long int StaticString::getHashCode() | ||
244 | { | ||
245 | unsigned long int nPos = nLen; | ||
246 | for( const char *s = (const char *)lpStr; *s; s++ ) | ||
247 | { | ||
248 | nPos = *s + (nPos << 6) + (nPos << 16) - nPos; | ||
249 | } | ||
250 | return nPos; | ||
251 | } | ||
252 | |||
diff --git a/src/staticstring.h b/src/staticstring.h index 732e860..68ca7ea 100644 --- a/src/staticstring.h +++ b/src/staticstring.h | |||
@@ -3,6 +3,7 @@ | |||
3 | 3 | ||
4 | #include <string> | 4 | #include <string> |
5 | #include "serializable.h" | 5 | #include "serializable.h" |
6 | //#include "hashable.h" | ||
6 | 7 | ||
7 | /** | 8 | /** |
8 | * Simple string managing class. Allows for dynamically allocated string data | 9 | * Simple string managing class. Allows for dynamically allocated string data |
@@ -11,12 +12,14 @@ | |||
11 | * and making accessing meta-info like length fast and reliable as well. | 12 | * and making accessing meta-info like length fast and reliable as well. |
12 | *@author Mike Buland | 13 | *@author Mike Buland |
13 | */ | 14 | */ |
14 | class StaticString : public Serializable | 15 | class StaticString : public Serializable//, public Hashable |
15 | { | 16 | { |
16 | public: | 17 | public: |
17 | StaticString(); | 18 | StaticString(); |
18 | StaticString( const char *lpNewStr, int nNewLen=-1 ); | 19 | StaticString( const char *lpNewStr, int nNewLen ); |
19 | StaticString( StaticString &xSrcStr, int nNewLen=-1 ); | 20 | StaticString( const char *lpNewStr ); |
21 | StaticString( StaticString &xSrcStr, int nNewLen ); | ||
22 | StaticString( StaticString &xSrcStr ); | ||
20 | StaticString( int nLength ); | 23 | StaticString( int nLength ); |
21 | virtual ~StaticString(); | 24 | virtual ~StaticString(); |
22 | 25 | ||
@@ -47,6 +50,8 @@ public: | |||
47 | 50 | ||
48 | virtual void serialize( class Serializer &ar ); | 51 | virtual void serialize( class Serializer &ar ); |
49 | 52 | ||
53 | virtual unsigned long int getHashCode(); | ||
54 | |||
50 | private: | 55 | private: |
51 | char *lpStr; | 56 | char *lpStr; |
52 | int nLen; | 57 | int nLen; |
diff --git a/src/test/exception/exception.cpp b/src/test/exception/exception.cpp index 33dcd5e..6417692 100644 --- a/src/test/exception/exception.cpp +++ b/src/test/exception/exception.cpp | |||
@@ -1,16 +1,16 @@ | |||
1 | #include <iostream> | 1 | #include <iostream> |
2 | #include "exception.h" | 2 | #include "exceptions.h" |
3 | 3 | ||
4 | int main() | 4 | int main() |
5 | { | 5 | { |
6 | try | 6 | try |
7 | { | 7 | { |
8 | throw Exception( 42, "There was an error on line: %d", __LINE__ ); | 8 | throw ExceptionBase( 42, "There was an error on line: %d", __LINE__ ); |
9 | } | 9 | } |
10 | catch( Exception &e ) | 10 | catch( ExceptionBase &e ) |
11 | { | 11 | { |
12 | std::cout << "Error "<< e.getErrorCode() << ": " << e.what() << "\n"; | 12 | std::cout << "Error "<< e.getErrorCode() << ": " << e.what() << "\n"; |
13 | } | 13 | } |
14 | 14 | ||
15 | throw Exception( 112, "This exception wasn't caught!"); | 15 | throw ExceptionBase( 112, "This exception wasn't caught!"); |
16 | } | 16 | } |
diff --git a/src/test/hash/main.cpp b/src/test/hash/main.cpp new file mode 100644 index 0000000..d0f5fa6 --- /dev/null +++ b/src/test/hash/main.cpp | |||
@@ -0,0 +1,10 @@ | |||
1 | #include "hash.h" | ||
2 | #include "staticstring.h" | ||
3 | |||
4 | int main() | ||
5 | { | ||
6 | //Hash<class StaticString, int> sTest; | ||
7 | |||
8 | //sTest.hasKey("hello"); | ||
9 | } | ||
10 | |||