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.