common: prevent using memset on non-POD types
[lttng-tools.git] / src / common / macros.hpp
index 49f163b42fb5a6c81cc3906f9016a06fac6383a2..b734652eea9ea89218d7e798edabed46fe272e73 100644 (file)
@@ -136,14 +136,45 @@ T *malloc(size_t size)
  */
 
 template<typename T>
-struct is_pod_or_void
+struct can_free
 {
-       static constexpr bool value = std::is_pod<T>::value || std::is_void<T>::value;
+       static constexpr bool value = std::is_trivially_destructible<T>::value || std::is_void<T>::value;
 };
 
-template<typename T, typename = typename std::enable_if<!is_pod_or_void<T>::value>::type>
+template<typename T, typename = typename std::enable_if<!can_free<T>::value>::type>
 void free(T *p) = delete;
 
+template<typename T>
+struct can_memset
+{
+       static constexpr bool value = std::is_pod<T>::value || std::is_void<T>::value;
+};
+
+template <typename T, typename = typename std::enable_if<!can_memset<T>::value>::type>
+void *memset(T *s, int c, size_t n) = delete;
+
+template<typename T>
+struct can_memcpy
+{
+       static constexpr bool value = std::is_trivially_copyable<T>::value;
+};
+
+template <typename T, typename U,
+               typename = typename std::enable_if<!can_memcpy<T>::value>::type,
+               typename = typename std::enable_if<!can_memcpy<U>::value>::type>
+void *memcpy(T *d, const U *s, size_t n) = delete;
+
+template<typename T>
+struct can_memmove
+{
+       static constexpr bool value = std::is_trivially_copyable<T>::value;
+};
+
+template <typename T, typename U,
+               typename = typename std::enable_if<!can_memmove<T>::value>::type,
+               typename = typename std::enable_if<!can_memmove<U>::value>::type>
+void *memmove(T *d, const U *s, size_t n) = delete;
+
 #ifndef ARRAY_SIZE
 #define ARRAY_SIZE(array)   (sizeof(array) / (sizeof((array)[0])))
 #endif
This page took 0.023254 seconds and 4 git commands to generate.