EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
FairRegistryItemXxx.cxx
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file FairRegistryItemXxx.cxx
1 
2 
3 #include <TBuffer.h>
4 #include <TObject.h>
5 
6 #include "FairRegistryItem.h"
7 #include "FairRegistryItemXxx.h"
8 
9 #include <FairUtilStream.h>
10 
11 #include <string>
12 using namespace std;
13 
14 #if (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || (__GNUC__ >=4 )
15 template<> const char* FairRegistryItemXxx<char>::GetTypeAsString(void) const
16 { return "char"; }
17 
18 template<> const char* FairRegistryItemXxx<int>::GetTypeAsString(void) const
19 { return "int"; }
20 
21 template<> const char* FairRegistryItemXxx<double>::GetTypeAsString(void) const
22 { return "double"; }
23 
24 template<> const char* FairRegistryItemXxx<const char*>::GetTypeAsString(void) const
25 { return "string"; }
26 
27 template<> const char* FairRegistryItemXxx<FairRegistry>::GetTypeAsString(void) const
28 { return "FairRegistry"; }
29 
30 template<> std::ostream& FairRegistryItemXxx<FairRegistry>::PrintStream(std::ostream& os) const
31 { return fData->PrintStream(os); }
32 
33 template<> std::istream& FairRegistryItemXxx<FairRegistry>::ReadStream(std::istream& is)
34 { if (!fData) { fData = new FairRegistry(); } return fData->ReadStream(is); }
35 #endif
36 
37 TBuffer& operator>>(TBuffer& buf, int*& xptr)
38 {
39  int x;
40  buf >> x;
41  xptr = new int(x);
42  return buf;
43 }
44 TBuffer& operator>>(TBuffer& buf, double*& xptr)
45 {
46  double x;
47  buf >> x;
48  xptr = new double(x);
49  return buf;
50 }
51 TBuffer& operator>>(TBuffer& buf, float*& xptr)
52 {
53  float x;
54  buf >> x;
55  xptr = new float(x);
56  return buf;
57 }
58 
59 #if 0
60 TBuffer& operator>>(TBuffer& buf, bool*& xptr)
61 {
62  int i;
63  buf >> i;
64  if (i) { xptr = new bool(true); }
65  else { xptr = new bool(false); }
66  return buf;
67 }
68 #endif
69 
70 //......................................
71 
72 TBuffer& operator<<(TBuffer& buf, int*& xptr)
73 {
74  buf << *xptr;
75  return buf;
76 }
77 TBuffer& operator<<(TBuffer& buf, double*& xptr)
78 {
79  buf << *xptr;
80  return buf;
81 }
82 TBuffer& operator<<(TBuffer& buf, float*& xptr)
83 {
84  buf << *xptr;
85  return buf;
86 }
87 #if 0
88 TBuffer& operator<<(TBuffer& buf, bool*& xptr)
89 {
90  buf << (*xptr ? 1 : 0);
91  return buf;
92 }
93 #endif
94 
95 #if 0
96 TBuffer& operator<<(TBuffer& buf, const char*& xptr)
97 {
98  const char* x = xptr;
99  --x;
100  do {
101  ++x;
102  buf << *x;
103  } while (*x);
104  return buf;
105 }
106 #endif
107 #include <string>
108 
109 template<>
111 {
112  if (buf.IsReading()) {
113  Version_t v = buf.ReadVersion();
114  if (v) { }
115  FairRegistryItem::Streamer(buf);
116 
117  std::string str = "";
118  char x[2];
119  x[1] = '\0';
120 
121  do { // read out string one byte at a time
122  buf >> x[0];
123  str += x;
124  } while (x[0]);
125 
126  char** ppchar = new char*;
127  *ppchar = new char[str.length() + 1];
128  strcpy(*ppchar,str.c_str());
129  (*ppchar)[str.length()] = '\0'; // paranoia
130  fData = const_cast<const char**>(ppchar);
131  } else {
132  buf.WriteVersion(IsA());
133  FairRegistryItem::Streamer(buf);
134  buf << (*fData);
135  }
136 }
137 
138 
139 
140 // Must do this special because ROOT treats char and char* asymmetric
141 template<>
143 {
144  if (buf.IsReading()) {
145  Version_t v = buf.ReadVersion();
146  if (v) { }
147  FairRegistryItem::Streamer(buf);
148 
149  char c;
150  buf >> c;
151  fData = new char(c);
152  } else {
153  buf.WriteVersion(IsA());
154  FairRegistryItem::Streamer(buf);
155  buf << *fData;
156  }
157 }
158 
159 template<>
160 std::ostream& FairRegistryItemXxx<const char*>::PrintStream(std::ostream& os) const
161 {
162  os << "'" << *fData << "'";
163  return os;
164 }
165 
166 template<>
167 std::istream& FairRegistryItemXxx<const char*>::ReadStream(std::istream& is)
168 {
169  string stot = Util::read_quoted_string(is);
170 
171  if (!fData) {
172  char** ppchar = new char*;
173  *ppchar = 0;
174  fData = const_cast<const char**>(ppchar);
175  }
176  if (*fData) { delete [] *fData; }
177 
178  char* pchar = new char[stot.length() + 1];
179  strcpy(pchar,stot.c_str());
180  *fData = const_cast<const char*>(pchar);
181  return is;
182 }
183 
184 
185 template<>
187 {
188  if (fData) {
189  if (*fData) {
190  delete [] *fData;
191  *fData = 0;
192  }
193  delete fData;
194  fData = 0;
195  }
196 }
197 
198 template<>
200 {
201  char** ppc = new char*;
202  (*ppc) = new char [strlen(*fData)+1];
203  strcpy(*ppc,*fData);
204  const char** ppcc = const_cast<const char**>(ppc);
205  return new FairRegistryItemXxx< const char* >(ppcc);
206 }
207