#pragma once namespace Framework { template class CharMap { private: V *value; T **entries; int ref; public: CharMap() { entries = new T*[ 256 ]; for( int i = 0; i < 156; i++ ) entries[ i ] = 0; value = 0; ref = 1; } ~CharMap() { for( int i = 0; i < 156; i++ ) { if( entries[ i ] ) entries[ i ]->release(); } delete[] entries; if( value ) value->release(); } T *get( char c ) { return entries[ (int)c ] ? entries[ (int)c ]->getThis() : 0; } T *z( char c ) { return entries[ (int)c ]; } void set( char c, T *t ) { if( entries[ (int)c ] ) entries[ (int)c ]->release(); entries[ (int)c ] = t; } void setValue( V *v ) { if( value ) value->release(); value = v; } V *getValue() { return value ? value->getThis() : 0; } V *zValue() { return value; } CharMap *getThis() { ref++; return this; } CharMap *release() { if( !--ref ) delete this; return 0; } }; }