54 lines
		
	
	
		
			983 B
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			54 lines
		
	
	
		
			983 B
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
| #ifndef HX_STRING_ALLOC
 | |
| #define HX_STRING_ALLOC
 | |
| 
 | |
| #include <stdlib.h>
 | |
| #include <stdint.h>
 | |
| 
 | |
| namespace hx
 | |
| {
 | |
| 
 | |
| class IStringAlloc
 | |
| {
 | |
|    public:
 | |
|       virtual void *allocBytes(size_t inBytes) = 0;
 | |
| 
 | |
|    protected:
 | |
|       ~IStringAlloc(){};
 | |
| };
 | |
| 
 | |
| template<int STACK>
 | |
| class StringAlloc : public IStringAlloc
 | |
| {
 | |
|    char buffer[STACK];
 | |
|    size_t alloced;
 | |
|    char   *heap;
 | |
| 
 | |
|    public:
 | |
|       inline StringAlloc() : alloced(0), heap(0) { }
 | |
|       ~StringAlloc()
 | |
|       {
 | |
|          if (heap)
 | |
|             free(heap);
 | |
|       }
 | |
|       void *allocBytes(size_t inBytes)
 | |
|       {
 | |
|          if (inBytes<=STACK)
 | |
|             return buffer;
 | |
|          if (inBytes>alloced)
 | |
|          {
 | |
|             alloced = inBytes;
 | |
|             heap = (char *)realloc(heap, alloced);
 | |
|          }
 | |
|          return heap;
 | |
|       }
 | |
|    private:
 | |
|       StringAlloc(const StringAlloc &);
 | |
|       void operator=(const StringAlloc &);
 | |
| };
 | |
| 
 | |
| typedef StringAlloc<100> strbuf;
 | |
| 
 | |
| } // end namespace hx
 | |
| 
 | |
| #endif
 |