forked from RaftLib/RaftLib
-
Notifications
You must be signed in to change notification settings - Fork 1
/
alloc_traits.tcc
79 lines (61 loc) · 2.05 KB
/
alloc_traits.tcc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include <iostream>
#include <cstdlib>
#include <cstdint>
#include <type_traits>
#include <typeinfo>
#ifndef _ALLOC_TRAITS_
#define _ALLOC_TRAITS_ 1
/**
* TODO, make a class to abstract figuring out the
* move/copy/allocate semantics...it's getting far
* go crowed in both the fifo.hpp and ringbufferheap.tcc
* files, and therefore confusing.
*/
//FIXME, add std::move for int_allocate obj
#ifndef L1D_CACHE_LINE_SIZE
#warning "Using 64 bytes as default cache line size, to fix recompile with -DL1D_CACHE_LINE_SIZE=XXX"
#define L1D_CACHE_LINE_SIZE 64
#endif
/**
* see if the given class/type fits within a single cache line
*/
template < class T >
struct fits_in_cache_line :
std::integral_constant< bool, ( sizeof( T ) <= L1D_CACHE_LINE_SIZE ) >{};
/**
* NOW FOR ALLOC CHECKS
*/
/**
* inline_class_alloc, true if less than cache and has a ctor
*/
template < class T >
struct inline_class_alloc : std::integral_constant< bool,
fits_in_cache_line< T >::value &&
std::is_class< T >::value >{};
/** cover the other two cases for non-ctor mem alloc **/
template < class T >
struct inline_nonclass_alloc : std::integral_constant< bool,
fits_in_cache_line< T >::value &&
( std::is_array< T >::value || std::is_fundamental< T >::value ) >{};
/** cover both inline cases **/
template < class T >
struct inline_alloc : std::integral_constant< bool,
inline_class_alloc< T >::value || inline_nonclass_alloc< T >::value >{};
/** covers classes & constructables that are bigger than cache **/
template < class T >
struct ext_class_alloc : std::integral_constant< bool,
! fits_in_cache_line< T >::value &&
std::is_class< T >::value >{};
/** designed for array types **/
template < class T >
struct ext_mem_alloc : std::integral_constant< bool,
! fits_in_cache_line< T >::value &&
std::is_array< T >::value >{};
template < class T >
struct ext_alloc : std::integral_constant< bool,
ext_class_alloc< T >::value ||
ext_mem_alloc< T >::value >{};
/**
* NOW FOR MOVE/PUSH CHECKS
*/
#endif