hobbes
a language, embedded compiler, and runtime for efficient dynamic expression evaluation, data storage and analysis
autorelease.H
Go to the documentation of this file.
1 
2 #ifndef HOBBES_UTIL_AUTORELEASE_HPP_INCLUDED
3 #define HOBBES_UTIL_AUTORELEASE_HPP_INCLUDED
4 
5 #include <vector>
6 
7 namespace hobbes {
8 
9 // simplify automatic destruction within bison parsers
11  typedef void (*presetfn)();
12  typedef std::vector<presetfn> ResetFns;
13 
14  static ResetFns& resetFns() {
15  thread_local ResetFns rs;
16  return rs;
17  }
18 
19  template <presetfn fn>
20  static bool registerClearFn() {
21  resetFns().push_back(fn);
22  return true;
23  }
24 
25  static void reset() {
26  ResetFns& rfs = resetFns();
27  for (ResetFns::const_iterator f = rfs.begin(); f != rfs.end(); ++f) {
28  (*f)();
29  }
30  }
31 };
32 
33 template <typename T>
34  struct Autorelease {
35  typedef std::vector<T*> Vals;
36  static Vals& vals() {
37  thread_local Vals vs;
38  return vs;
39  }
40 
41  static void reset() {
42  Vals& vs = vals();
43  for (typename Vals::iterator i = vs.begin(); i != vs.end(); ++i) {
44  delete *i;
45  }
46  vs.clear();
47  }
48 
49  static void mark(T* x) {
50  thread_local bool saved = false;
51  if (!saved) {
52  AutoreleaseSet::registerClearFn<&Autorelease<T>::reset>();
53  saved = true;
54  }
55  vals().push_back(x);
56  }
57  };
58 
59 template <typename T>
60  T* autorelease(T* x) {
62  return x;
63  }
64 
65 }
66 
67 #endif
static void mark(T *x)
Definition: autorelease.H:49
static bool registerClearFn()
Definition: autorelease.H:20
static void reset()
Definition: autorelease.H:41
std::vector< T * > Vals
Definition: autorelease.H:35
void(* presetfn)()
Definition: autorelease.H:11
Definition: boot.H:7
Definition: autorelease.H:34
std::vector< presetfn > ResetFns
Definition: autorelease.H:12
static ResetFns & resetFns()
Definition: autorelease.H:14
Definition: autorelease.H:10
size_t rs(const reader::MetaData &md, size_t o, size_t n, uint8_t *b)
Definition: storage.H:1720
ExprPtr fn(const str::seq &vns, const ExprPtr &b, const LexicalAnnotation &la)
Definition: expr.H:837
static void reset()
Definition: autorelease.H:25
T * autorelease(T *x)
Definition: autorelease.H:60
static Vals & vals()
Definition: autorelease.H:36