00001
00002
00003 #ifndef __ARC_ISTRING__
00004 #define __ARC_ISTRING__
00005
00006 #include <list>
00007 #include <string>
00008 #include <ostream>
00009
00010 #include <sigc++/slot.h>
00011 #include <glibmm.h>
00012
00013 #include <stdio.h>
00014 #include <stdlib.h>
00015 #include <string.h>
00016
00017 #define istring(x) (x)
00018
00019 namespace Arc {
00020
00021 class PrintFBase {
00022 public:
00023 PrintFBase();
00024 virtual ~PrintFBase();
00025 virtual void msg(std::ostream& os) = 0;
00026 virtual void msg(std::string& s) = 0;
00027 void Retain();
00028 bool Release();
00029 private:
00030
00031 PrintFBase(const PrintFBase&);
00032
00033 PrintFBase& operator=(const PrintFBase&);
00034 int refcount;
00035 };
00036
00037 const char* FindTrans(const char *p);
00038 const char* FindNTrans(const char *s, const char *p, unsigned long n);
00039
00040 template<class T0 = int, class T1 = int, class T2 = int, class T3 = int,
00041 class T4 = int, class T5 = int, class T6 = int, class T7 = int>
00042 class PrintF
00043 : public PrintFBase {
00044
00045 public:
00046
00047 PrintF(const std::string& m,
00048 const T0& tt0 = 0, const T1& tt1 = 0,
00049 const T2& tt2 = 0, const T3& tt3 = 0,
00050 const T4& tt4 = 0, const T5& tt5 = 0,
00051 const T6& tt6 = 0, const T7& tt7 = 0)
00052 : PrintFBase(),
00053 m(m) {
00054 Copy(t0, tt0);
00055 Copy(t1, tt1);
00056 Copy(t2, tt2);
00057 Copy(t3, tt3);
00058 Copy(t4, tt4);
00059 Copy(t5, tt5);
00060 Copy(t6, tt6);
00061 Copy(t7, tt7);
00062 }
00063
00064 ~PrintF() {
00065 for (std::list<char*>::iterator it = ptrs.begin();
00066 it != ptrs.end(); it++)
00067 free(*it);
00068 }
00069
00070 virtual void msg(std::ostream& os) {
00071
00072 char buffer[2048];
00073 snprintf(buffer, 2048, Get(m),
00074 Get(t0), Get(t1), Get(t2), Get(t3),
00075 Get(t4), Get(t5), Get(t6), Get(t7));
00076 os << buffer;
00077 }
00078
00079 virtual void msg(std::string& s) {
00080
00081 char buffer[2048];
00082 snprintf(buffer, 2048, Get(m),
00083 Get(t0), Get(t1), Get(t2), Get(t3),
00084 Get(t4), Get(t5), Get(t6), Get(t7));
00085 s = buffer;
00086 }
00087
00088 private:
00089
00090
00091 template<class T, class U>
00092 inline void Copy(T& t, const U& u) {
00093 t = u;
00094 }
00095
00096
00097 template<class T>
00098 inline void Copy(T& t, const char u[]) {
00099 strcpy(t, u);
00100 }
00101
00102
00103 inline void Copy(const char*& t, const char*const& u) {
00104 t = strdup(u);
00105 ptrs.push_back(const_cast<char*>(t));
00106 }
00107
00108
00109 inline void Copy(char*& t, char*const& u) {
00110 t = strdup(u);
00111 ptrs.push_back(t);
00112 }
00113
00114
00115 template<class T>
00116 inline static const T& Get(const T& t) {
00117 return t;
00118 }
00119
00120
00121 inline static const char* Get(const char*const& t) {
00122 return FindTrans(t);
00123 }
00124
00125
00126 inline static const char* Get(char*const& t) {
00127 return FindTrans(const_cast<const char*&>(t));
00128 }
00129
00130
00131 inline static const char* Get(const std::string& t) {
00132 return FindTrans(t.c_str());
00133 }
00134
00135
00136 inline static const char* Get(std::string (*t)()) {
00137 return FindTrans(t().c_str());
00138 }
00139
00140
00141 inline static const char* Get(const Glib::ustring& t) {
00142 return FindTrans(t.c_str());
00143 }
00144
00145
00146 inline static const char* Get(Glib::ustring (*t)()) {
00147 return FindTrans(t().c_str());
00148 }
00149
00150
00151 inline static const char* Get(const sigc::slot<const char*> *t) {
00152 return (*t)();
00153 }
00154
00155 std::string m;
00156 T0 t0;
00157 T1 t1;
00158 T2 t2;
00159 T3 t3;
00160 T4 t4;
00161 T5 t5;
00162 T6 t6;
00163 T7 t7;
00164 std::list<char*> ptrs;
00165 };
00166
00167 class IString {
00168
00169 public:
00170
00171 IString(const std::string& m)
00172 : p(new PrintF<>(m)) {}
00173
00174 template<class T0>
00175 IString(const std::string& m, const T0& t0)
00176 : p(new PrintF<T0>(m, t0)) {}
00177
00178 template<class T0, class T1>
00179 IString(const std::string& m, const T0& t0, const T1& t1)
00180 : p(new PrintF<T0, T1>(m, t0, t1)) {}
00181
00182 template<class T0, class T1, class T2>
00183 IString(const std::string& m, const T0& t0, const T1& t1, const T2& t2)
00184 : p(new PrintF<T0, T1, T2>(m, t0, t1, t2)) {}
00185
00186 template<class T0, class T1, class T2, class T3>
00187 IString(const std::string& m, const T0& t0, const T1& t1, const T2& t2, const T3& t3)
00188 : p(new PrintF<T0, T1, T2, T3>(m, t0, t1, t2, t3)) {}
00189
00190 template<class T0, class T1, class T2, class T3, class T4>
00191 IString(const std::string& m, const T0& t0, const T1& t1, const T2& t2, const T3& t3, const T4& t4)
00192 : p(new PrintF<T0, T1, T2, T3, T4>(m, t0, t1, t2, t3, t4)) {}
00193
00194 template<class T0, class T1, class T2, class T3, class T4, class T5>
00195 IString(const std::string& m, const T0& t0, const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5)
00196 : p(new PrintF<T0, T1, T2, T3, T4, T5>(m, t0, t1, t2, t3, t4, t5)) {}
00197
00198 template<class T0, class T1, class T2, class T3, class T4, class T5, class T6>
00199 IString(const std::string& m, const T0& t0, const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6)
00200 : p(new PrintF<T0, T1, T2, T3, T4, T5, T6>(m, t0, t1, t2, t3, t4, t5, t6)) {}
00201
00202 template<class T0, class T1, class T2, class T3, class T4, class T5, class T6, class T7>
00203 IString(const std::string& m, const T0& t0, const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7)
00204 : p(new PrintF<T0, T1, T2, T3, T4, T5, T6, T7>(m, t0, t1, t2, t3, t4, t5, t6, t7)) {}
00205
00206 ~IString();
00207
00208 IString(const IString& istr);
00209 IString& operator=(const IString& istr);
00210 std::string str(void);
00211
00212 private:
00213
00214 PrintFBase *p;
00215
00216 friend std::ostream& operator<<(std::ostream& os, const IString& msg);
00217 };
00218
00219 std::ostream& operator<<(std::ostream& os, const IString& msg);
00220
00221 }
00222
00223 #endif // __ARC_ISTRING__