summaryrefslogtreecommitdiff
path: root/src/fstring.h
diff options
context:
space:
mode:
authorMike Buland <eichlan@xagasoft.com>2007-05-11 07:51:40 +0000
committerMike Buland <eichlan@xagasoft.com>2007-05-11 07:51:40 +0000
commit033c41ed57348abb3a418166b1fb39bfad3312de (patch)
tree72edbb0b7ff35ef35e4d533bca384b4f7c986942 /src/fstring.h
parentad92dc50b7cdf7cfe086f21d19442d03a90fd05d (diff)
downloadlibbu++-033c41ed57348abb3a418166b1fb39bfad3312de.tar.gz
libbu++-033c41ed57348abb3a418166b1fb39bfad3312de.tar.bz2
libbu++-033c41ed57348abb3a418166b1fb39bfad3312de.tar.xz
libbu++-033c41ed57348abb3a418166b1fb39bfad3312de.zip
Added a list template class, seems to work pretty well for now, I may have
forgotten proper cleanup in the deconstructor, but besides that you can do almost everything you need. I'll make a slist/stack next, probably with the same basic code, just a different structure (not doubley-linked). The xml system from old-libbu++ is almost completely converted, I was going to re-write it, but this seemed easier at first, it may not have been, we'll see. It almost parses everything again, and almost outputs again, and it does use streams now. The FString is partway to doing minimum chunk allocations, so that adding single-characters will be really fast up to the minimum chunk size. I also figured out how to add this optimization without any extra variables taking up space, and it's optional in the template, which is cool. You can specify the size of the blocks (default 256 bytes), if it's 0 then they'll be like the old FString, 1 chunk per operation. The next FString update should be allowing efficient removal from the begining of the string by faking it, and simply moving a secondary base pointer ahead, and then optimizing appends after that fact to simply move the existing data around if you shouldn't have to re-allocate (alla FlexBuf). The final fun addition that I'm planning is a simple switch in the template (boolean) that will switch an FString into a thread-safe mode without changing the interface or anything that you can do with them at all. It may increasing memory usage, but they should still be better than std::strings, and totally thread-safe. The best part of that is that if it's done with a boolean template parameter and if statements that only test that parameter controlling flow, the code that you don't want (threadsafe/non-threadsafe) won't be included at all post-optimization.
Diffstat (limited to 'src/fstring.h')
-rw-r--r--src/fstring.h14
1 files changed, 9 insertions, 5 deletions
diff --git a/src/fstring.h b/src/fstring.h
index 877e5a7..f738f63 100644
--- a/src/fstring.h
+++ b/src/fstring.h
@@ -28,7 +28,7 @@ namespace Bu
28 * data is actually copied. This also means that you never need to put any 28 * data is actually copied. This also means that you never need to put any
29 * FBasicString into a ref-counting container class. 29 * FBasicString into a ref-counting container class.
30 */ 30 */
31 template< typename chr, typename chralloc=std::allocator<chr>, typename chunkalloc=std::allocator<struct FStringChunk<chr> > > 31 template< typename chr, int nMinSize=256, typename chralloc=std::allocator<chr>, typename chunkalloc=std::allocator<struct FStringChunk<chr> > >
32 class FBasicString : public Archival 32 class FBasicString : public Archival
33 { 33 {
34#ifndef VALTEST 34#ifndef VALTEST
@@ -36,7 +36,7 @@ namespace Bu
36#endif 36#endif
37 private: 37 private:
38 typedef struct FStringChunk<chr> Chunk; 38 typedef struct FStringChunk<chr> Chunk;
39 typedef struct FBasicString<chr, chralloc, chunkalloc> MyType; 39 typedef struct FBasicString<chr, nMinSize, chralloc, chunkalloc> MyType;
40 40
41 public: 41 public:
42 FBasicString() : 42 FBasicString() :
@@ -131,6 +131,11 @@ namespace Bu
131 appendChunk( pNew ); 131 appendChunk( pNew );
132 } 132 }
133 133
134 void append( const chr cData )
135 {
136 append( &cData, 1 );
137 }
138
134 void prepend( const chr *pData ) 139 void prepend( const chr *pData )
135 { 140 {
136 long nLen; 141 long nLen;
@@ -231,8 +236,7 @@ namespace Bu
231 236
232 MyType &operator +=( const chr pData ) 237 MyType &operator +=( const chr pData )
233 { 238 {
234 chr tmp[2] = { pData, (chr)0 }; 239 append( &pData, 1 );
235 append( tmp );
236 240
237 return (*this); 241 return (*this);
238 } 242 }
@@ -475,7 +479,7 @@ namespace Bu
475 } 479 }
476 } 480 }
477 481
478 void copyFrom( const FBasicString<chr, chralloc, chunkalloc> &rSrc ) 482 void copyFrom( const FBasicString<chr, nMinSize, chralloc, chunkalloc> &rSrc )
479 { 483 {
480 if( rSrc.pFirst == NULL ) 484 if( rSrc.pFirst == NULL )
481 return; 485 return;