summaryrefslogtreecommitdiff
path: root/omegalib/omega_lib/include/basic/ConstString.h
blob: 5149e55fd6f32cf35afd22976d6f4fab3ea1ea07 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#if ! defined _Const_String_h
#define _Const_String_h 1

#include <string>

namespace omega {
  
// should be inside Const_String, but I can't get it to
// compile the hashTable when it is: hashTable can't be
// global, but if it and its size are static to Const_String,
// the compiler still doesn't seem to like the definition,
// or the declaration either for that matter.

class ConstStringRep {
public:
  const char *name;
  int count;
  ConstStringRep *nextInBucket;
  ConstStringRep(const char *t);
};

class Const_String {
private:
  ConstStringRep *rep;
  void buildRep(const char *t);

public:
  Const_String();
  Const_String(const char* t);
  Const_String(const std::string &s);
  Const_String(const Const_String & t) {rep = t.rep;}

  operator int() const;
  int null() const;

  operator const char*() const;
  operator std::string() const;
  int operator++(int);
  int operator++();
  int operator--(int);
  int operator--();
  friend int operator==(const Const_String &x, const Const_String &y);
  friend int operator!=(const Const_String &x, const Const_String &y);
  friend int operator<(const Const_String &x, const Const_String &y);
  friend  int     operator >(const Const_String &x, const Const_String &y);

};

#if defined SCREWED_UP_CASTING_RULES
static int operator==(const Const_String &x, const char *y)
{ return x == (Const_String) y; }
static int operator!=(const Const_String &x, const char *y)
{ return x != (Const_String) y; }
#endif

} // namespace

#endif