#pragma once #include "ReferenceCounter.h" namespace Framework { template class CharMap : public virtual ReferenceCounter { private: V value; T** entries; public: CharMap() : ReferenceCounter() { entries = new T*[256]; for (int i = 0; i < 256; i++) entries[i] = 0; value = 0; } ~CharMap() { for (int i = 0; i < 256; i++) { if (entries[i]) entries[i]->release(); } delete[] entries; } T* get(unsigned char c) { return entries[(int)c] ? dynamic_cast(entries[(int)c]->getThis()) : 0; } T* z(unsigned char c) const { return entries[(int)c]; } void set(unsigned char c, T* t) { if (entries[(int)c]) entries[(int)c]->release(); entries[(int)c] = t; } void setValue(V v) { value = v; } V getValue() const { return value; } }; template class RCCharMap : public virtual ReferenceCounter { private: V* value; T** entries; public: RCCharMap() : ReferenceCounter() { entries = new T*[256]; for (int i = 0; i < 256; i++) entries[i] = 0; value = 0; } ~RCCharMap() { for (int i = 0; i < 256; i++) { if (entries[i]) entries[i]->release(); } delete[] entries; if (value) value->release(); } T* get(unsigned char c) { return entries[(int)c] ? dynamic_cast(entries[(int)c]->getThis()) : 0; } T* z(unsigned char c) const { return entries[(int)c]; } void set(unsigned 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 ? dynamic_cast(value->getThis()) : 0; } V* zValue() { return value; } }; } // namespace Framework