SST/macro
global_builtin.h
Go to the documentation of this file.
1 /*
2  * This file is part of SST/macroscale:
3  * The macroscale architecture simulator from the SST suite.
4  * Copyright (c) 2009 Sandia Corporation.
5  * This software is distributed under the BSD License.
6  * Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
7  * the U.S. Government retains certain rights in this software.
8  * For more information, see the LICENSE file in the top
9  * SST/macroscale directory.
10  */
11 
12 #ifndef SSTMAC_SOFTWARE_PROCESS_GLOBAL_BUILTIN_H_INCLUDED
13 #define SSTMAC_SOFTWARE_PROCESS_GLOBAL_BUILTIN_H_INCLUDED
14 
16 #include <sprockit/errors.h>
17 
18 namespace sstmac {
19 namespace sw {
20 
21 template<typename T>
23 {
24 
25  private:
26  typedef spkt_unordered_map<long, T> val_map;
27  val_map vals_;
28  mutable T init_;
29  mutable bool isinit_;
30 
31  bool
33 
34  val_map& vals = const_cast<val_map&> (vals_);
35  if (ptxt != process_context::none) {
36  typename val_map::iterator it = vals.find(ptxt);
37  if (it == vals.end()) {
38  vals[ptxt] = init_;
39  }
40  return true;
41  }
42  else {
43  return false;
44  }
45  }
46 
47  public:
48  typedef typename val_map::const_iterator const_iterator;
49 
50  explicit
52  isinit_ = false;
53  }
54 
55  explicit
57  init_(init), isinit_(true) {
58  }
59 
60  explicit
63  "copy constructor should never be called for primitive global");
64  }
65 
66  virtual
68 
69  }
70 
71  void
72  print_all() const {
73  typename val_map::const_iterator it = vals_.begin();
74  for (; it != vals_.end(); ++it) {
75  std::cout << it->second << std::endl;
76  }
77  }
78 
79  virtual T&
80  get_val() const {
82  val_map& vals = const_cast<val_map&> (vals_);
83  if (ptxt != process_context::none) {
84  typename val_map::iterator it = vals.find(ptxt);
85  if (it == vals.end()) {
86  if(!isinit_) {
87  init_ = 0;
88  isinit_ = true;
89  }
90  T& ret = vals[ptxt];
91  ret = init_;
92  return ret;
93  }
94  else {
95  return it->second;
96  }
97  }
98  return const_cast<T&> (init_);
99  }
100 
101  virtual std::string
102  to_string() const {
103  std::stringstream ss;
104  ss << get_val();
105  return ss.str();
106  }
107 
108  template<typename U>
109  T&
110  operator =(const U& b) {
111  T& myval = get_val();
112  myval = (T) b;
113  return myval;
114  }
115 
116  template<typename U>
117  T&
118  operator +=(const U& b) {
119  T& myval = get_val();
120  myval += (T) b;
121  return myval;
122  }
123 
124  template<typename U>
125  T&
126  operator -=(const U& b) {
127  T& myval = get_val();
128  myval -= (T) b;
129  return myval;
130  }
131 
132  template<typename U>
133  T&
134  operator *=(const U& b) {
135  T& myval = get_val();
136  myval *= (T) b;
137  return myval;
138  }
139 
140  template<typename U>
141  T&
142  operator /=(const U& b) {
143  T& myval = get_val();
144  myval /= (T) b;
145  return myval;
146  }
147 
148  template<typename U>
149  bool
150  operator ==(const U& b) const {
151  T myval = get_val();
152  T otherval = (T) b;
153  return myval == otherval;
154  }
155 
156  template<typename U>
157  bool
158  operator !=(const U& b) const {
159  T myval = get_val();
160  // T otherval = (T) b;
161  return myval != b;
162  }
163 
164  //operator T() {
165  // T& myval = get_val();
166  // return myval;
167  //}
168 
169  operator T&() {
170  T& myval = get_val();
171  return myval;
172  }
173 
174  T
175  operator ++(int dummy) {
176  T& myval = get_val();
177  return myval++;
178  }
179 
180  T
181  operator --(int dummy) {
182  T& myval = get_val();
183  return myval--;
184  }
185 
186  T
188  T& myval = get_val();
189  return ++myval;
190  }
191 
192  T
194  T& myval = get_val();
195  return --myval;
196  }
197 
198  operator double() const {
199  return (double) get_val();
200  }
201 
202  operator int() const {
203  return (int) get_val();
204  }
205 
206  operator bool() const {
207  return (bool) get_val();
208  }
209 
210  operator size_t() const {
211  return (size_t) get_val();
212  }
213 
214  operator long() const {
215  return (long) get_val();
216  }
217 
218  operator long long() const {
219  return get_val();
220  }
221 
222  template<typename U>
223  T
224  operator +(const U& b) const {
225  return (get_val() + (T) b);
226  }
227 
228  template<typename U>
229  T
230  operator -(const U& b) const {
231  return (get_val() - (T) b);
232  }
233 
234  template<typename U>
235  T
236  operator /(const U& b) const {
237  return (get_val() / ((T) b));
238  }
239 
240  template<typename U>
241  T
242  operator <<(const U& b) const {
243  return (get_val() << ((T) b));
244  }
245 
246  template<typename U>
247  T
248  operator >>(const U& b) const {
249  return (get_val() >> ((T) b));
250  }
251 
252  template<typename U>
253  T
254  operator %(const U& b) const {
255  return get_val() % ((T) b);
256  }
257 
258  template<typename U>
259  T
260  operator *(const U& b) const {
261  return (get_val() * ((T) b));
262  }
263 
264  T*
265  operator&() const {
266  return &get_val();
267  }
268 
269  template<typename U>
270  bool
271  operator >(const U& b) {
272  T myval = get_val();
273  T otherval = (T) b;
274  return myval > otherval;
275  }
276 
277  template<typename U>
278  bool
279  operator <(const U& b) {
280  T myval = get_val();
281  T otherval = (T) b;
282  return myval < otherval;
283  }
284 
285  void
287  if (init_) {
288  delete init_;
289  init_ = 0;
290  }
291  typedef typename spkt_unordered_map<long, T>::iterator myiter;
292  myiter it;
293  for (it = vals_.begin(); it != vals_.end(); ++it)
294  if (it->second) {
295  delete it->second;
296  }
297  vals_.clear();
298  }
299 
300  const_iterator
301  begin() const {
302  return vals_.begin();
303  }
304  const_iterator
305  end() const {
306  return vals_.end();
307  }
308 
309 };
310 
311 template<typename T, typename U>
312 U
314  const sstmac_global_builtin<T>& t)
315 {
316  return ((U) b) / ((T) t);
317 }
318 
319 template<typename T, typename U>
320 U
322  const sstmac_global_builtin<T>& t)
323 {
324  return (U) b + (T) t;
325 }
326 
327 template<typename T, typename U>
328 U
330  const sstmac_global_builtin<T>& t)
331 {
332  return (U) b - (T) t;
333 }
334 
335 #if 0
336 template<typename T, typename U>
337 U
339  const sstmac_global_builtin<T>& t)
340 {
341  return ((U) b) * ((T) t);
342 }
343 
344 template<typename T, typename U>
345 U
347  T& t)
348 {
349  return ((U) b) * ((T) t);
350 }
351 
352 template<typename T, typename U>
353 T
354 operator*(const U& b,
355  const sstmac_global_builtin<T>& t)
356 {
357  return ((U) b) * ((T) t);
358 }
359 #endif
360 
361 template<typename T, typename U>
362 U
363 operator/(const U& b, const sstmac_global_builtin<T>& t)
364 {
365  return b / ((T) t);
366 }
367 
368 template<typename T, typename U>
369 U
370 operator+(const U& b, const sstmac_global_builtin<T>& t)
371 {
372  return b + (T) t;
373 }
374 
375 template<typename T, typename U>
376 U
377 operator-(const U& b, const sstmac_global_builtin<T>& t)
378 {
379  return b - (T) t;
380 }
381 
382 #if 0
383 template<typename T, typename U>
384 U
385 operator*(const U& b, const sstmac_global_builtin<T>& t)
386 {
387  return b * ((T) t);
388 }
389 #endif
390 
391 template<typename T, typename U>
392 U
393 operator%(const U& b, const sstmac_global_builtin<T>& t)
394 {
395  return b % ((T) t);
396 }
397 
398 template<typename T, typename U>
399 U
401 {
402  b += (T) t;
403  return b;
404 }
405 
406 template<typename T, typename U>
407 U
409 {
410  b -= (T) t;
411  return b;
412 }
413 
414 template<typename T, typename U>
415 bool
416 operator<(const U& b, const sstmac_global_builtin<T>& t)
417 {
418  return b < (T) t;
419 }
420 
421 template<typename T, typename U>
422 bool
423 operator>(const U& b, const sstmac_global_builtin<T>& t)
424 {
425  return b > (T) t;
426 }
427 
428 template <typename T>
429 inline std::ostream&
430 operator<<(std::ostream& os, const sstmac_global_builtin<T>& t)
431 {
432  os << (T) t;
433  return os;
434 }
435 
436 }
437 }
438 #endif
439 
process_context current_context() const
spkt_unordered_map< long, T > val_map
An error indicating some format was not correct.
Definition: errors.h:131
parallel_runtime * init()
SUMI = Simulator unified messagine interface It is also the name for a solid ink in Japanese - i...
bool check_init(process_context ptxt) const
const_iterator end() const
#define spkt_throw_printf(exc, template_str,...)
Definition: errors.h:37
val_map::const_iterator const_iterator
bool operator!=(const U &b) const
bool operator==(const U &b) const
sstmac_global_builtin(const sstmac_global_builtin< T > &other)
const_iterator begin() const
virtual std::string to_string() const