summaryrefslogtreecommitdiffstats
path: root/third_party/msgpack/include/msgpack/v2/object_fwd.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/msgpack/include/msgpack/v2/object_fwd.hpp')
-rw-r--r--third_party/msgpack/include/msgpack/v2/object_fwd.hpp109
1 files changed, 109 insertions, 0 deletions
diff --git a/third_party/msgpack/include/msgpack/v2/object_fwd.hpp b/third_party/msgpack/include/msgpack/v2/object_fwd.hpp
new file mode 100644
index 0000000000..9c44aae609
--- /dev/null
+++ b/third_party/msgpack/include/msgpack/v2/object_fwd.hpp
@@ -0,0 +1,109 @@
+//
+// MessagePack for C++ static resolution routine
+//
+// Copyright (C) 2008-2016 FURUHASHI Sadayuki and KONDO Takatoshi
+//
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef MSGPACK_V2_OBJECT_FWD_HPP
+#define MSGPACK_V2_OBJECT_FWD_HPP
+
+#include "msgpack/v2/object_fwd_decl.hpp"
+#include "msgpack/object_fwd.hpp"
+
+namespace msgpack {
+
+/// @cond
+MSGPACK_API_VERSION_NAMESPACE(v2) {
+/// @endcond
+
+struct object : v1::object {
+ object() {}
+ object(v1::object const& o):v1::object(o) {}
+ /// Construct object from T
+ /**
+ * If `v` is the type that is corresponding to MessegePack format str, bin, ext, array, or map,
+ * you need to call `object(const T& v, msgpack::zone& z)` instead of this constructor.
+ *
+ * @tparam T The type of `v`.
+ * @param v The value you want to convert.
+ */
+ template <typename T>
+ explicit object(const T& v) {
+ *this << v;
+ }
+
+ /// Construct object from T
+ /**
+ * The object is constructed on the zone `z`.
+ * See https://github.com/msgpack/msgpack-c/wiki/v1_1_cpp_object
+ *
+ * @tparam T The type of `v`.
+ * @param v The value you want to convert.
+ * @param z The zone that is used by the object.
+ */
+ template <typename T>
+ object(const T& v, msgpack::zone& z):v1::object(v, z) {}
+
+public:
+ /// Convert the object
+ /**
+ * If the object can't be converted to T, msgpack::type_error would be thrown.
+ * @tparam T The type of v.
+ * @param v The value you want to get. `v` is output parameter. `v` is overwritten by converted value from the object.
+ * @return The reference of `v`.
+ */
+ template <typename T>
+ T& convert(T& v) const { return v1::object::convert(v); }
+
+ using v1::object::with_zone;
+ implicit_type convert() const;
+};
+
+#if !defined(MSGPACK_USE_CPP03)
+
+namespace adaptor {
+
+// If v1 has as specialization for T, then dispatch v1::adaptor::as<T>.
+// So I call v1::has_as<T> meta function intentionally.
+template <typename T>
+struct as<T, typename std::enable_if<v1::has_as<T>::value>::type> : v1::adaptor::as<T> {
+};
+
+} // namespace adaptor
+
+template <typename T>
+struct has_as {
+private:
+ template <typename U>
+ static auto check(U*) ->
+ typename std::enable_if<
+ // check v2 specialization
+ std::is_same<
+ decltype(adaptor::as<U>()(std::declval<msgpack::object>())),
+ U
+ >::value
+ ||
+ // check v1 specialization
+ v1::has_as<U>::value,
+ std::true_type
+ >::type;
+ template <typename...>
+ static std::false_type check(...);
+public:
+ using type = decltype(check<T>(MSGPACK_NULLPTR));
+ static constexpr bool value = type::value;
+};
+
+#endif // !defined(MSGPACK_USE_CPP03)
+
+/// @cond
+} // MSGPACK_API_VERSION_NAMESPACE(v2)
+/// @endcond
+
+} // namespace msgpack
+
+#endif // MSGPACK_V2_OBJECT_FWD_HPP