#include <string>
#include <ctype.h>
struct char_traits : public std::char_traits<char>
{
static bool eq(const char_type& c1, const char_type& c2)
{return static_cast<bool>(tolower(c1) == tolower(c2));}
static bool lt(const char_type& c1, const char_type& c2)
{return static_cast<bool>(tolower(c1) < tolower(c2));}
static int compare(const char_type* s1, const char_type* s2, size_t n)
{return strncasecmp(s1, s2, n);}
};
typedef std::basic_string<char, char_traits, std::allocator<char> > String;
StringManager_Map mngr;
StringManager_TST mngr;
class StringManager
{
protected:
typedef std::map<const std::string*, unsigned int, string_compare>::iterator ITERATOR;
typedef std::pair<const std::string*, unsigned int> PAIR;
std::map<const std::string*, unsigned int, string_compare> content;
public:
StringManager(void);
~StringManager(void);
const std::string *get_ref(const std::string &str);
unsigned int count_ref(const std::string &str);
unsigned int remove_ref(const std::string &str);
};
class StringManager
{
public:
StringManager();
virtual ~StringManager();
const std::string * addString(const std::string & str);
void deleteString(const std::string & str);
size_t countRefs(const std::string & str) const;
size_t numStrings() const;
virtual size_t bytesUsed() const = 0;
virtual void dumpTable(std::ostream & os) const = 0; // for debugging: dump whole table to os.
protected:
size_t numStrings_;
virtual SharedStringEntry * prepareEntry(const std::string & str) = 0;
virtual bool unrefEntry(const std::string & str) = 0;
virtual const SharedStringEntry * getEntry(const std::string & str) const = 0;
};