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>
10template <
size_t s>
class sized_array_memory {
public:
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);
16 template <
typename T>
static const type *cast(
const T *x) {
17 return reinterpret_cast<const type *
>(x);
19 static void fill(
void *a,
size_t n,
const void *x) {
20 for (; n != 0; --n, a = (
char *) a + s)
23 static void move_construct(
void* a,
void* x) {
26 static void copy(
void *dst,
const void *src,
size_t n) {
28 memcpy(dst, src, n * s);
30 static void move(
void *dst,
const void *src,
size_t n) {
32 memmove(dst, src, n * s);
34 static void move_onto(
void *dst,
const void *src,
size_t n) {
36 memmove(dst, src, n * s);
38 static void destroy(
void *a,
size_t n) {
41 static void mark_noaccess(
void *a,
size_t n) {
42#ifdef VALGRIND_MAKE_MEM_NOACCESS
43 VALGRIND_MAKE_MEM_NOACCESS(a, n * s);
48 static void mark_undefined(
void *a,
size_t n) {
49#ifdef VALGRIND_MAKE_MEM_UNDEFINED
50 VALGRIND_MAKE_MEM_UNDEFINED(a, n * s);
57template <
typename T>
class typed_array_memory {
public:
59 static T *cast(T *x) {
62 static const T *cast(
const T *x) {
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);
69 static void move_construct(T* a, T* x) {
70#if HAVE_CXX_RVALUE_REFERENCES
71 new((
void *) a) T(click_move(*x));
73 new((
void *) a) T(*x);
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]);
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);
87 for (
size_t i = 0; i != n; ++i) {
88 new((
void *) &dst[i]) T(src[i]);
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) {
97 new((
void *) dst) T(*src);
100 for (
size_t i = 0; i != n; ++i) {
102 new((
void *) &dst[i]) T(src[i]);
106 static void destroy(T *a,
size_t n) {
107 for (
size_t i = 0; i != n; ++i)
110 static void mark_noaccess(T *a,
size_t n) {
111 sized_array_memory<
sizeof(T)>::mark_noaccess(a, n);
113 static void mark_undefined(T *a,
size_t n) {
114 sized_array_memory<
sizeof(T)>::mark_undefined(a, n);
118template <
typename T>
class array_memory :
public conditional<has_trivial_copy<T>::value, sized_array_memory<sizeof(T)>, typed_array_memory<T> > {};
Template defining a fixed-size character array.
Definition type_traits.hh:167
Conditional type transformation.
Definition type_traits.hh:43