L4Re - L4 Runtime Environment
static_container
1 // vi:set ft=cpp: -*- Mode: C++ -*-
2 
3 #pragma once
4 
5 #include <l4/cxx/type_traits>
6 #include <stddef.h>
7 
8 namespace cxx {
9 
10 template< typename T >
11 class Static_container
12 {
13 private:
14  struct X : T
15  {
16  void *operator new (size_t, void *p) throw() { return p; }
17  void operator delete (void *) {}
18  X() = default;
19  template<typename ...Args>
20  X(Args && ...a) : T(cxx::forward<Args>(a)...) {}
21  };
22 
23 public:
24  void operator = (Static_container const &) = delete;
25  Static_container(Static_container const &) = delete;
26  Static_container() = default;
27 
28  T *get() { return reinterpret_cast<X*>(_s); }
29  T *operator -> () { return get(); }
30  T &operator * () { return *get(); }
31  operator T* () { return get(); }
32 
33  void construct()
34  { new (reinterpret_cast<void*>(_s)) X; }
35 
36  template< typename ...Args >
37  void construct(Args && ...args)
38  { new (reinterpret_cast<void*>(_s)) X(cxx::forward<Args>(args)...); }
39 
40 private:
41  char _s[sizeof(X)] __attribute__((aligned(__alignof(X))));
42 };
43 
44 }
45 
46 
Our C++ library.
Definition: arith:22