2#ifndef __ASE_MEMORY_HH__
3#define __ASE_MEMORY_HH__
18void* fast_mem_alloc (
size_t size);
20void fast_mem_free (
void *mem);
23template<
typename T,
size_t ALIGNMENT = FastMemory::cache_line_size>
27 static_assert ((ALIGNMENT & (ALIGNMENT - 1)) == 0);
28 static_assert (
alignof (T) <= ALIGNMENT);
29 const size_t n_elements_ = 0;
30 T *
const data_ =
nullptr;
33 void range_check (
size_t n)
const
40 n_elements_ (n_elements),
41 data_ ((T*) fast_mem_alloc (
sizeof (T) * n_elements_))
46 n_elements_ (elements.size()),
47 data_ ((T*) fast_mem_alloc (
sizeof (T) * n_elements_))
49 std::copy (elements.begin(), elements.end(), begin());
54 fast_mem_free (data_);
56 T* begin () {
return &data_[0]; }
57 T* end () {
return &data_[n_elements_]; }
58 size_t size ()
const {
return n_elements_; }
59 T& operator[] (
size_t n) {
return data_[n]; }
60 const T& operator[] (
size_t n)
const {
return data_[n]; }
61 T& at (
size_t n) { range_check (n);
return data_[n]; }
62 const T& at (
size_t n)
const { range_check (n);
return data_[n]; }
74 void*
operator new (
std::size_t sz) {
return new_ (sz, __cxxalignment); }
75 void*
operator new[] (
std::size_t sz) {
return new_ (sz, __cxxalignment); }
79 void operator delete (
void *ptr,
std::size_t sz) { delete_ (ptr, sz, __cxxalignment); }
80 void operator delete[] (
void *ptr,
std::size_t sz) { delete_ (ptr, sz, __cxxalignment); }
91 void *
const block_start =
nullptr;
92 const uint32 block_length = 0;
94 Block (
void *b,
uint32 l) : block_start (b), block_length (l) {}
123 size_t alignment ()
const {
return start_ ?
size_t (1) << __builtin_ctz (
size_t (start_)) : 0; }
124 size_t size ()
const {
return size_; }
125 char*
mem ()
const {
return (
char*) start_; }
130 explicit HugePage (
void *m,
size_t s);
133using HugePageP = HugePage::HugePageP;
140 constexpr void qset (
uint quark)
noexcept { quark_ = quark; }
142 using size_type = std::string::size_type;
143 using const_iterator = std::string::const_iterator;
144 using const_reference = std::string::const_reference;
145 using const_reverse_iterator = std::string::const_reverse_iterator;
147 CString (
const char *c) { assign (c); }
148 CString (
const char *c, size_type s) { assign (c, s); }
150 constexpr CString ()
noexcept =
default;
153 constexpr CString& operator= (
const CString &c)
noexcept {
return assign (c); }
154 constexpr CString& operator= (
CString &&c)
noexcept {
return assign (c); }
156 CString& operator= (
const char *c)
noexcept {
return assign (c); }
159 constexpr CString& assign (
const CString &c)
noexcept { qset (c.quark_);
return *
this; }
163 CString& assign (size_type count,
char ch)
noexcept {
return this->operator= (
std::string (count, ch)); }
165 const char* c_str ()
const noexcept {
return string().
c_str(); }
166 const char* data ()
const noexcept {
return string().
data(); }
167 const_reference at (size_type pos)
const {
return string().
at (pos); }
168 const_reference operator[] (size_type pos)
const {
return string().operator[] (pos); }
169 size_type capacity ()
const noexcept {
return string().
capacity(); }
170 size_type length ()
const noexcept {
return string().
length(); }
171 bool empty ()
const noexcept {
return string().
empty(); }
172 size_type size ()
const noexcept {
return string().
size(); }
173 const_iterator begin ()
const noexcept {
return string().
begin(); }
174 const_iterator cbegin ()
const noexcept {
return string().
cbegin(); }
175 const_iterator end ()
const noexcept {
return string().
end(); }
176 const_iterator cend ()
const noexcept {
return string().
cend(); }
177 const_reverse_iterator rbegin ()
const noexcept {
return string().
rbegin(); }
178 const_reverse_iterator crbegin ()
const noexcept {
return string().
crbegin(); }
179 const_reverse_iterator rend ()
const noexcept {
return string().
rend(); }
180 const_reverse_iterator crend ()
const noexcept {
return string().
crend(); }
182 friend bool operator== (
CString a,
CString b) {
return a.quark_ == b.quark_; }
185 friend bool operator== (
CString a,
const char *b) {
return a.
string() == b; }
186 friend bool operator== (
const char *a,
CString b) {
return a == b.
string(); }
198 static constexpr const std::string::size_type npos = -1;
211 return ::std::hash<::std::string>{} (
cs.string());
Compact, deduplicating string variant for constant strings.
static CString lookup(const std::string &s)
const std::string & string() const
Convert CString into a std::string.
Array with cache-line-alignment containing a fixed numer of PODs.
#define ASE_CLASS_NON_COPYABLE(ClassName)
Delete copy ctor and assignment operator.
constexpr size_t cache_line_size
Minimum alignment >= cache line size, see getconf LEVEL1_DCACHE_LINESIZE.
The Anklang C++ API namespace.
std::string string_format(const char *format, const Args &...args) __attribute__((__format__(__printf__
Format a string similar to sprintf(3) with support for std::string and std::ostringstream convertible...
uint64_t uint64
A 64-bit unsigned integer, use PRI*64 in format strings.
uint32_t uint32
A 32-bit unsigned integer.
uint32_t uint
Provide 'uint' as convenience type.
Memory area (over-)aligned to cache size and utilizing huge pages.
uint64 location() const
Address of memory area.
size_t alignment() const
Alignment for block addresses and length.
uint64 reserved() const
Reserved memory area in bytes.
Block allocate(uint32 length) const
Create a memory block from cache-line aligned memory area, MT-Unsafe.
void release(Block allocatedblock) const
Realease a previously allocated block, MT-Unsafe.
AllocatorP fma
Identifier for the associated memory allocator.
Reference for an allocated memory block.
Interface to the OS huge page allocator.
char * mem() const
Allocated memroy area.
size_t alignment() const
Alignment of the memory area.
static HugePageP allocate(size_t minimum_alignment, size_t bytelength)
Try to allocate a HugePage >= bytelength with minimum_alignment, usual sizes are 2MB.
size_t size() const
Size in bytes of the memroy area.