View on GitHub
jbson
C++11/1y BSON library
visit.hpp
1 // Copyright Christian Manning 2013.
2 // Distributed under the Boost Software License, Version 1.0.
3 // (See accompanying file LICENSE_1_0.txt or copy at
4 // http://www.boost.org/LICENSE_1_0.txt)
5 
6 #ifndef JBSON_VISIT_HPP
7 #define JBSON_VISIT_HPP
8 
9 #include "../element_fwd.hpp"
10 
11 JBSON_PUSH_DISABLE_DEPRECATED_WARNING
12 
13 namespace jbson {
14 namespace detail {
15 
21 template <template <element_type EType, typename... VArgs> class Visitor, typename... Args>
22 std::enable_if_t<std::is_void<
23  decltype(std::declval<Visitor<element_type::int64_element, Args...>>()(std::declval<Args&&>()...))>::value>
24 visit(element_type type, Args&&... args) {
25  switch(type) {
27  Visitor<element_type::double_element, Args...> {}
28  (std::forward<Args>(args)...);
29  return;
31  Visitor<element_type::string_element, Args...> {}
32  (std::forward<Args>(args)...);
33  return;
35  Visitor<element_type::document_element, Args...> {}
36  (std::forward<Args>(args)...);
37  return;
39  Visitor<element_type::array_element, Args...> {}
40  (std::forward<Args>(args)...);
41  return;
43  // Visitor<element_type::binary_element, Args...> {}
44  // (std::forward<Args>(args)...);
45  return;
47  Visitor<element_type::undefined_element, Args...> {}
48  (std::forward<Args>(args)...);
49  return;
51  Visitor<element_type::oid_element, Args...> {}
52  (std::forward<Args>(args)...);
53  return;
55  Visitor<element_type::boolean_element, Args...> {}
56  (std::forward<Args>(args)...);
57  return;
59  Visitor<element_type::date_element, Args...> {}
60  (std::forward<Args>(args)...);
61  return;
63  Visitor<element_type::null_element, Args...> {}
64  (std::forward<Args>(args)...);
65  return;
67  Visitor<element_type::regex_element, Args...> {}
68  (std::forward<Args>(args)...);
69  return;
71  Visitor<element_type::db_pointer_element, Args...> {}
72  (std::forward<Args>(args)...);
73  return;
75  Visitor<element_type::javascript_element, Args...> {}
76  (std::forward<Args>(args)...);
77  return;
79  Visitor<element_type::symbol_element, Args...> {}
80  (std::forward<Args>(args)...);
81  return;
83  Visitor<element_type::scoped_javascript_element, Args...> {}
84  (std::forward<Args>(args)...);
85  return;
87  Visitor<element_type::int32_element, Args...> {}
88  (std::forward<Args>(args)...);
89  return;
91  Visitor<element_type::timestamp_element, Args...> {}
92  (std::forward<Args>(args)...);
93  return;
95  Visitor<element_type::int64_element, Args...> {}
96  (std::forward<Args>(args)...);
97  return;
99  Visitor<element_type::min_key, Args...> {}
100  (std::forward<Args>(args)...);
101  return;
103  Visitor<element_type::max_key, Args...> {}
104  (std::forward<Args>(args)...);
105  return;
106  default:
107  BOOST_THROW_EXCEPTION(invalid_element_type{});
108  };
109 }
110 
116 template <template <element_type EType, typename... VArgs> class Visitor, typename... Args>
117 std::enable_if_t<!std::is_void<decltype(
118  std::declval<Visitor<element_type::int64_element, Args...>>()(std::declval<Args&&>()...))>::value,
119  decltype(std::declval<Visitor<element_type::int64_element, Args...>>()(std::declval<Args&&>()...))>
120 visit(element_type type, Args&&... args) {
121  switch(type) {
123  return Visitor<element_type::double_element, Args...> {}
124  (std::forward<Args>(args)...);
126  return Visitor<element_type::string_element, Args...> {}
127  (std::forward<Args>(args)...);
129  return Visitor<element_type::document_element, Args...> {}
130  (std::forward<Args>(args)...);
132  return Visitor<element_type::array_element, Args...> {}
133  (std::forward<Args>(args)...);
135  // return Visitor<element_type::binary_element, Args...> {}
136  // (std::forward<Args>(args)...);
138  return Visitor<element_type::undefined_element, Args...> {}
139  (std::forward<Args>(args)...);
141  return Visitor<element_type::oid_element, Args...> {}
142  (std::forward<Args>(args)...);
144  return Visitor<element_type::boolean_element, Args...> {}
145  (std::forward<Args>(args)...);
147  return Visitor<element_type::date_element, Args...> {}
148  (std::forward<Args>(args)...);
150  return Visitor<element_type::null_element, Args...> {}
151  (std::forward<Args>(args)...);
153  return Visitor<element_type::regex_element, Args...> {}
154  (std::forward<Args>(args)...);
156  return Visitor<element_type::db_pointer_element, Args...> {}
157  (std::forward<Args>(args)...);
159  return Visitor<element_type::javascript_element, Args...> {}
160  (std::forward<Args>(args)...);
162  return Visitor<element_type::symbol_element, Args...> {}
163  (std::forward<Args>(args)...);
165  return Visitor<element_type::scoped_javascript_element, Args...> {}
166  (std::forward<Args>(args)...);
168  return Visitor<element_type::int32_element, Args...> {}
169  (std::forward<Args>(args)...);
171  return Visitor<element_type::timestamp_element, Args...> {}
172  (std::forward<Args>(args)...);
174  return Visitor<element_type::int64_element, Args...> {}
175  (std::forward<Args>(args)...);
177  return Visitor<element_type::min_key, Args...> {}
178  (std::forward<Args>(args)...);
180  return Visitor<element_type::max_key, Args...> {}
181  (std::forward<Args>(args)...);
182  default:
183  BOOST_THROW_EXCEPTION(invalid_element_type{}
184  << detail::actual_type(typeid(Visitor<element_type::min_key, Args...>)));
185  };
186 }
187 
188 } // namespace detail
189 } // namespace jbson
190 
191 JBSON_POP_WARNINGS
192 #endif // JBSON_VISIT_HPP
element_type
The element_type enum represents a BSON data type.
Definition: element_fwd.hpp:36
std::string or boost::string_ref (string_type)
std::enable_if_t< std::is_void< decltype(std::declval< Visitor< element_type::int64_element, Args...>>()(std::declval< Args && >)...))>::value > visit(element_type type, Args &&...args)
void visit.
Definition: visit.hpp:24
basic_document> (document_type)
Exception type thrown when an element has a type value not represented by element_type.
Definition: error.hpp:31