1 /* ///////////////////////////////////////////////////////////////////////
2 * File: help_functions.h
7 * Brief: Memory helpful functions
10 * Copyright (c) 2008-2020, Waruqi All rights reserved.
11 * //////////////////////////////////////////////////////////////////// */
13 #ifndef EXTL_MEMORY_HELP_FUNCTIONS_H
14 #define EXTL_MEMORY_HELP_FUNCTIONS_H
16 /*!\file help_functions.h
17 * \brief Memory helpful functions
20 # error help_functions.h need be supported by c++.
23 /* ///////////////////////////////////////////////////////////////////////
26 # include "../prefix.h"
27 # include "../type/traits/is_void.h"
29 #ifdef EXTL_TYPE_TRAITS_IS_POD_SUPPORT
30 # include "../type/traits/is_pod.h"
33 /* ///////////////////////////////////////////////////////////////////////
38 /* ///////////////////////////////////////////////////////////////////////
39 * Memory block operations
43 EXTL_INLINE
void const* mem_copy(void* dest
, void const* src
, e_size_t size
)
45 EXTL_ASSERT(NULL
!= dest
);
46 EXTL_ASSERT(NULL
!= src
);
47 return ::memcpy(dest
, src
, size
);
51 EXTL_INLINE e_int_t
mem_cmp(void const* lhs
, void const* rhs
, e_size_t size
)
53 EXTL_ASSERT(NULL
!= lhs
);
54 EXTL_ASSERT(NULL
!= rhs
);
56 return ::memcmp(lhs
, rhs
, size
);
60 EXTL_INLINE
void const* mem_move(void* dest
, void const* src
, e_size_t size
)
62 EXTL_ASSERT(NULL
!= dest
);
63 EXTL_ASSERT(NULL
!= src
);
65 return ::memmove(dest
, src
, size
);
69 EXTL_INLINE
void const* mem_fill(void* dest
, e_int_t
const& value
, e_size_t size
)
71 EXTL_ASSERT(NULL
!= dest
);
72 return ::memset(dest
, value
, size
);
76 EXTL_INLINE
void const* mem_fill_0(void* dest
, e_size_t size
)
78 EXTL_ASSERT(NULL
!= dest
);
79 return ::memset(dest
, 0, size
);
81 /* ///////////////////////////////////////////////////////////////////////
82 * POD memory block operations
85 template < typename_param_k D
, typename_param_k S
>
86 EXTL_INLINE D
const* pod_copy_n(D
* dest
, S
const* src
, e_size_t n
)
88 #ifdef EXTL_TYPE_TRAITS_IS_POD_SUPPORT
92 EXTL_MUST_NOT_BE_VOID(D
);
93 EXTL_MUST_NOT_BE_VOID(S
);
95 return static_cast<D
const*>(mem_copy(dest
, src
, n
* sizeof(D
)));
99 template < typename_param_k D
, typename_param_k S
>
100 EXTL_INLINE D
const* non_pod_copy_n(D
* dest
, S
const* src
, e_size_t n
)
103 for(; 0 != n
; ++dest
, ++src
, --n
)
110 template < typename_param_k D
, typename_param_k S
>
111 EXTL_INLINE e_int_t
pod_cmp_n(D
const* lhs
, S
const* rhs
, e_size_t n
)
113 #ifdef EXTL_TYPE_TRAITS_IS_POD_SUPPORT
117 EXTL_MUST_NOT_BE_VOID(D
);
118 EXTL_MUST_NOT_BE_VOID(S
);
121 for(e_size_t i
= 0; i
< n
; ++i
, ++lhs
, ++rhs
)
125 return (*lhs
< *rhs
)? -1 : + 1;
131 EXTL_INLINE e_int_t
pod_cmp_n(e_char_t
const* lhs
, e_char_t
const* rhs
, e_size_t n
)
133 return mem_cmp(lhs
, rhs
, n
* sizeof(e_char_t
));
137 template < typename_param_k D
, typename_param_k S
>
138 EXTL_INLINE e_int_t
non_pod_cmp_n(D
const* lhs
, S
const* rhs
, e_size_t n
)
140 EXTL_ASSERT(NULL
!= lhs
);
141 EXTL_ASSERT(NULL
!= rhs
);
143 for(e_size_t i
= 0; i
< n
; ++i
, ++lhs
, ++rhs
)
147 return (*lhs
< *rhs
)? -1 : + 1;
153 template < typename_param_k D
, typename_param_k S
>
154 EXTL_INLINE D
const* pod_move_n(D
* dest
, S
const* src
, e_size_t n
)
156 #ifdef EXTL_TYPE_TRAITS_IS_POD_SUPPORT
161 EXTL_MUST_NOT_BE_VOID(D
);
162 EXTL_MUST_NOT_BE_VOID(S
);
164 return static_cast<D
const*>(mem_move(dest
, src
, n
* sizeof(D
)));
167 template < typename_param_k D
, typename_param_k S
>
168 EXTL_INLINE D
const* non_pod_move_n(D
* dest
, S
const* src
, e_size_t n
)
170 EXTL_ASSERT(NULL
!= dest
);
171 EXTL_ASSERT(NULL
!= src
);
173 return non_pod_copy_n(dest
, src
, n
);
177 template < typename_param_k D
, typename_param_k V
>
178 EXTL_INLINE D
const* pod_fill_n(D
* dest
, V
const& value
, e_size_t n
)
180 #ifdef EXTL_TYPE_TRAITS_IS_POD_SUPPORT
184 EXTL_MUST_NOT_BE_VOID(D
);
189 for(; 0 != n
; ++dest
, --n
)
195 /// pod_fill_n: Optimizatiion
196 EXTL_INLINE e_char_t
const* pod_fill_n(e_char_t
* dest
, e_char_t
const& value
, e_size_t n
)
198 return static_cast<e_char_t
const*>(mem_fill(dest
, value
, n
* sizeof(e_char_t
)));
201 template < typename_param_k D
, typename_param_k V
>
202 EXTL_INLINE D
const* non_pod_fill_n(D
* dest
, V
const& value
, e_size_t n
)
204 EXTL_ASSERT(NULL
!= dest
);
208 for(; 0 != n
; ++dest
, --n
)
216 template < typename_param_k D
>
217 EXTL_INLINE D
const* pod_fill_0_n(D
* dest
, e_size_t n
)
219 #ifdef EXTL_TYPE_TRAITS_IS_POD_SUPPORT
222 EXTL_MUST_NOT_BE_VOID(D
);
224 return static_cast<D
const*>(mem_fill_0(dest
, n
* sizeof(D
)));
228 template < typename_param_k D
>
229 EXTL_INLINE D
const* non_pod_fill_0_n(D
* dest
, e_size_t n
)
231 EXTL_ASSERT(NULL
!= dest
);
235 for(; 0 != n
; ++dest
, --n
)
241 /* ///////////////////////////////////////////////////////////////////////
244 #ifdef EXTL_MEMORY_HELP_FUNCTIONS_TEST_ENABLE
245 # include "unit_test/help_functions_test.h"
248 /* ///////////////////////////////////////////////////////////////////////
253 /* //////////////////////////////////////////////////////////////////// */
254 #endif /* EXTL_MEMORY_HELP_FUNCTIONS_H */
255 /* //////////////////////////////////////////////////////////////////// */