Click
Loading...
Searching...
No Matches
array_memory.hh
1#ifndef CLICK_ARRAY_MEMORY_HH
2#define CLICK_ARRAY_MEMORY_HH 1
3#include <click/glue.hh>
5#if HAVE_VALGRIND && HAVE_VALGRIND_MEMCHECK_H
6# include <valgrind/memcheck.h>
7#endif
8CLICK_DECLS
9
10template <size_t s> class sized_array_memory { public:
11 typedef char_array<s> type;
12 template <typename T> static type *cast(T *x) {
13 static_assert(sizeof(type) == s, "char_array<> size off");
14 return reinterpret_cast<type *>(x);
15 }
16 template <typename T> static const type *cast(const T *x) {
17 return reinterpret_cast<const type *>(x);
18 }
19 static void fill(void *a, size_t n, const void *x) {
20 for (; n != 0; --n, a = (char *) a + s)
21 memcpy(a, x, s);
22 }
23 static void move_construct(void* a, void* x) {
24 memcpy(a, x, s);
25 }
26 static void copy(void *dst, const void *src, size_t n) {
27 if (n)
28 memcpy(dst, src, n * s);
29 }
30 static void move(void *dst, const void *src, size_t n) {
31 if (n)
32 memmove(dst, src, n * s);
33 }
34 static void move_onto(void *dst, const void *src, size_t n) {
35 if (n)
36 memmove(dst, src, n * s);
37 }
38 static void destroy(void *a, size_t n) {
39 (void) a, (void) n;
40 }
41 static void mark_noaccess(void *a, size_t n) {
42#ifdef VALGRIND_MAKE_MEM_NOACCESS
43 VALGRIND_MAKE_MEM_NOACCESS(a, n * s);
44#else
45 (void) a, (void) n;
46#endif
47 }
48 static void mark_undefined(void *a, size_t n) {
49#ifdef VALGRIND_MAKE_MEM_UNDEFINED
50 VALGRIND_MAKE_MEM_UNDEFINED(a, n * s);
51#else
52 (void) a, (void) n;
53#endif
54 }
55};
56
57template <typename T> class typed_array_memory { public:
58 typedef T type;
59 static T *cast(T *x) {
60 return x;
61 }
62 static const T *cast(const T *x) {
63 return x;
64 }
65 static void fill(T *a, size_t n, const T *x) {
66 for (size_t i = 0; i != n; ++i)
67 new((void *) &a[i]) T(*x);
68 }
69 static void move_construct(T* a, T* x) {
70#if HAVE_CXX_RVALUE_REFERENCES
71 new((void *) a) T(click_move(*x));
72#else
73 new((void *) a) T(*x);
74#endif
75 }
76 static void copy(T *dst, const T *src, size_t n) {
77 for (size_t i = 0; i != n; ++i)
78 new((void *) &dst[i]) T(src[i]);
79 }
80 static void move(T *dst, const T *src, size_t n) {
81 if (dst > src && src + n > dst) {
82 for (dst += n - 1, src += n - 1; n != 0; --n, --dst, --src) {
83 new((void *) dst) T(*src);
84 src->~T();
85 }
86 } else {
87 for (size_t i = 0; i != n; ++i) {
88 new((void *) &dst[i]) T(src[i]);
89 src[i].~T();
90 }
91 }
92 }
93 static void move_onto(T *dst, const T *src, size_t n) {
94 if (dst > src && src + n > dst) {
95 for (dst += n - 1, src += n - 1; n != 0; --n, --dst, --src) {
96 dst->~T();
97 new((void *) dst) T(*src);
98 }
99 } else {
100 for (size_t i = 0; i != n; ++i) {
101 dst[i].~T();
102 new((void *) &dst[i]) T(src[i]);
103 }
104 }
105 }
106 static void destroy(T *a, size_t n) {
107 for (size_t i = 0; i != n; ++i)
108 a[i].~T();
109 }
110 static void mark_noaccess(T *a, size_t n) {
111 sized_array_memory<sizeof(T)>::mark_noaccess(a, n);
112 }
113 static void mark_undefined(T *a, size_t n) {
114 sized_array_memory<sizeof(T)>::mark_undefined(a, n);
115 }
116};
117
118template <typename T> class array_memory : public conditional<has_trivial_copy<T>::value, sized_array_memory<sizeof(T)>, typed_array_memory<T> > {};
119
120CLICK_ENDDECLS
121#endif
Template defining a fixed-size character array.
Definition type_traits.hh:167
Conditional type transformation.
Definition type_traits.hh:43
Type traits structures.