echelon  0.8.0
customization_hooks.hpp
1 // Copyright (c) 2012-2014 Christopher Hinz
2 //
3 // Distributed under the Boost Software License, Version 1.0. (See accompanying
4 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
5 
6 #ifndef ECHELON_HDF5_CUSTOMIZATION_HOOKS_HPP
7 #define ECHELON_HDF5_CUSTOMIZATION_HOOKS_HPP
8 
9 // FIXME: enable raise_type to be called via ADL and remove this include
10 #include <echelon/object_reference.hpp>
11 
12 #include <echelon/hdf5/object_reference.hpp>
13 #include <echelon/hdf5/precursor/object_reference.hpp>
14 #include <echelon/hdf5/precursor/handle.hpp>
15 
16 #include <type_traits>
17 #include <utility>
18 #include <string>
19 #include <vector>
20 
21 namespace echelon
22 {
23 namespace hdf5
24 {
25 
26 template <typename T>
27 class coersion_protected_ref
28 {
29 public:
30  coersion_protected_ref(T& value_) : value_{&value_}
31  {
32  }
33 
34  operator T&()
35  {
36  return *value_;
37  }
38 
39  T& get()
40  {
41  return *value_;
42  }
43 
44 private:
45  T* value_;
46 };
47 
48 inline const char* lower_type(coersion_protected_ref<const std::string> value)
49 {
50  return value.get().c_str();
51 }
52 
53 inline std::string raise_type(const char* value)
54 {
55  return std::string(value);
56 }
57 
58 inline hdf5::object_reference lower_type(const echelon::object_reference& value)
59 {
60  return value.raw_ref();
61 }
62 
63 inline echelon::object_reference raise_type(const hdf5::object_reference& value)
64 {
65  return echelon::object_reference(value);
66 }
67 
68 template <typename T>
69 inline auto lower_type_internal(T&& value, precursor::handle)
70  -> decltype(lower_type(std::forward<T>(value)))
71 {
72  return lower_type(std::forward<T>(value));
73 }
74 
75 template <typename T>
76 inline auto raise_type_internal(T&& value, precursor::handle)
77  -> decltype(raise_type(std::forward<T>(value)))
78 {
79  return raise_type(std::forward<T>(value));
80 }
81 
82 inline precursor::object_reference lower_type_internal(const object_reference& value,
83  precursor::handle)
84 {
85  return value.raw_ref();
86 }
87 
88 inline object_reference raise_type_internal(const precursor::object_reference& value,
89  precursor::handle internal_handle)
90 {
91  return object_reference(value, internal_handle);
92 }
93 
94 namespace detail
95 {
96 
97 template <typename T>
98 constexpr auto is_trivially_storable_impl(int)
99  -> decltype((lower_type_internal(std::declval<T>(), std::declval<precursor::handle>()),
100  bool {}))
101 {
102  return false;
103 }
104 
105 template <typename T>
106 constexpr bool is_trivially_storable_impl(...)
107 {
108  return true;
109 }
110 }
111 
112 template <typename T>
113 constexpr bool is_trivially_storable()
114 {
115  return detail::is_trivially_storable_impl<T>(0);
116 }
117 
118 static_assert(!is_trivially_storable<std::string>(),
119  "std::string should not be trivially storable.");
120 }
121 }
122 
123 #endif
echelon&#39;s core namespace
Definition: attribute.cpp:10
A reference to an HDF5 object.
Definition: object_reference.hpp:24
const hdf5::object_reference & raw_ref() const
The underlying low-level reference.
Definition: object_reference.hpp:47