1// vi:set ft=cpp: -*- Mode: C++ -*- 2 3/* SPDX-License-Identifier: GPL-2.0-only or License-Ref-kk-custom */ 4/* 5 * Copyright (C) 2012-2013 Technische Universität Dresden. 6 * Copyright (C) 2016-2017 Kernkonzept GmbH. 7 */ 8 9#pragma once 10 11#include <l4/cxx/type_traits> 12#include <stddef.h> 13 14namespace cxx { 15 16template< typename T > 17class Static_container 18{ 19private: 20 struct X : T 21 { 22 void *operator new (size_t, void *p) throw() { return p; } 23 void operator delete (void *) {} 24 X() = default; 25 template<typename ...Args> 26 X(Args && ...a) : T(cxx::forward<Args>(a)...) {} 27 }; 28 29public: 30 void operator = (Static_container const &) = delete; 31 Static_container(Static_container const &) = delete; 32 Static_container() = default; 33 34 T *get() { return reinterpret_cast<X*>(_s); } 35 T *operator -> () { return get(); } 36 T &operator * () { return *get(); } 37 operator T* () { return get(); } 38 39 void construct() 40 { new (reinterpret_cast<void*>(_s)) X; } 41 42 template< typename ...Args > 43 void construct(Args && ...args) 44 { new (reinterpret_cast<void*>(_s)) X(cxx::forward<Args>(args)...); } 45 46private: 47 char _s[sizeof(X)] __attribute__((aligned(__alignof(X)))); 48}; 49 50} 51 52 53