diff --git a/CMakeLists.txt b/CMakeLists.txt index fe18db16..a13939d9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -97,42 +97,70 @@ LIST (APPEND msgpack_HEADERS IF (MSGPACK_ENABLE_CXX) LIST (APPEND msgpack_HEADERS include/msgpack.hpp + include/msgpack_fwd.hpp include/msgpack/adaptor/bool.hpp + include/msgpack/adaptor/bool_fwd.hpp include/msgpack/adaptor/char_ptr.hpp + include/msgpack/adaptor/char_ptr_fwd.hpp include/msgpack/adaptor/cpp11/array.hpp + include/msgpack/adaptor/cpp11/array_fwd.hpp include/msgpack/adaptor/cpp11/array_char.hpp + include/msgpack/adaptor/cpp11/array_char_fwd.hpp include/msgpack/adaptor/cpp11/forward_list.hpp + include/msgpack/adaptor/cpp11/forward_list_fwd.hpp include/msgpack/adaptor/cpp11/tuple.hpp + include/msgpack/adaptor/cpp11/tuple_fwd.hpp include/msgpack/adaptor/define.hpp include/msgpack/adaptor/deque.hpp + include/msgpack/adaptor/deque_fwd.hpp include/msgpack/adaptor/detail/cpp03_define.hpp include/msgpack/adaptor/detail/cpp03_msgpack_tuple.hpp + include/msgpack/adaptor/detail/cpp03_msgpack_tuple_fwd.hpp include/msgpack/adaptor/detail/cpp11_define.hpp include/msgpack/adaptor/detail/cpp11_msgpack_tuple.hpp + include/msgpack/adaptor/detail/cpp11_msgpack_tuple_fwd.hpp include/msgpack/adaptor/fixint.hpp + include/msgpack/adaptor/fixint_fwd.hpp include/msgpack/adaptor/float.hpp + include/msgpack/adaptor/float_fwd.hpp include/msgpack/adaptor/int.hpp + include/msgpack/adaptor/int_fwd.hpp include/msgpack/adaptor/list.hpp + include/msgpack/adaptor/list_fwd.hpp include/msgpack/adaptor/map.hpp + include/msgpack/adaptor/map_fwd.hpp include/msgpack/adaptor/msgpack_tuple.hpp + include/msgpack/adaptor/msgpack_tuple_fwd.hpp include/msgpack/adaptor/nil.hpp + include/msgpack/adaptor/nil_fwd.hpp include/msgpack/adaptor/pair.hpp + include/msgpack/adaptor/pair_fwd.hpp include/msgpack/adaptor/raw.hpp + include/msgpack/adaptor/raw_fwd.hpp include/msgpack/adaptor/set.hpp + include/msgpack/adaptor/set_fwd.hpp include/msgpack/adaptor/string.hpp + include/msgpack/adaptor/string_fwd.hpp include/msgpack/adaptor/tr1/unordered_map.hpp + include/msgpack/adaptor/tr1/unordered_map_fwd.hpp include/msgpack/adaptor/tr1/unordered_set.hpp + include/msgpack/adaptor/tr1/unordered_set_fwd.hpp include/msgpack/adaptor/vector.hpp + include/msgpack/adaptor/vector_fwd.hpp + include/msgpack/adaptor/vector_char.hpp + include/msgpack/adaptor/vector_char_fwd.hpp include/msgpack/cpp_config.hpp include/msgpack/detail/cpp03_zone.hpp include/msgpack/detail/cpp11_zone.hpp include/msgpack/fbuffer.hpp include/msgpack/object.hpp + include/msgpack/object_fwd.hpp include/msgpack/pack.hpp include/msgpack/sbuffer.hpp include/msgpack/type.hpp include/msgpack/unpack.hpp include/msgpack/version.hpp + include/msgpack/versioning.hpp include/msgpack/vrefbuffer.hpp include/msgpack/zbuffer.hpp include/msgpack/zone.hpp diff --git a/erb/cpp03_define.hpp.erb b/erb/cpp03_define.hpp.erb index 27d165e0..45a72f93 100644 --- a/erb/cpp03_define.hpp.erb +++ b/erb/cpp03_define.hpp.erb @@ -18,6 +18,10 @@ #ifndef MSGPACK_CPP03_DEFINE_HPP #define MSGPACK_CPP03_DEFINE_HPP +#include "msgpack/versioning.hpp" +#include "msgpack/adaptor/msgpack_tuple_fwd.hpp" +#include "msgpack/object_fwd.hpp" + #define MSGPACK_DEFINE(...) \ template \ void msgpack_pack(Packer& pk) const \ @@ -37,6 +41,7 @@ // MSGPACK_ADD_ENUM must be used in the global namespace. #define MSGPACK_ADD_ENUM(enum) \ namespace msgpack { \ + MSGPACK_API_VERSION_NAMESPACE(v1) { \ template <> \ inline object const& operator>> (object const& o, enum& v) \ { \ @@ -58,9 +63,11 @@ } \ }; \ } \ + } \ } namespace msgpack { +MSGPACK_API_VERSION_NAMESPACE(v1) { namespace type { @@ -141,6 +148,7 @@ define, A<%=j%><%}%>> make_define(A0& a0<%1.upto(i) {|j|%>, <%}%> } // namespace type +} // MSGPACK_API_VERSION_NAMESPACE(v1) } // namespace msgpack diff --git a/erb/cpp03_msgpack_tuple.hpp.erb b/erb/cpp03_msgpack_tuple.hpp.erb index 930f5368..9f3534a8 100644 --- a/erb/cpp03_msgpack_tuple.hpp.erb +++ b/erb/cpp03_msgpack_tuple.hpp.erb @@ -18,17 +18,20 @@ #ifndef MSGPACK_CPP03_MSGPACK_TUPLE_HPP #define MSGPACK_CPP03_MSGPACK_TUPLE_HPP +#include "msgpack/versioning.hpp" #include "msgpack/object.hpp" namespace msgpack { +MSGPACK_API_VERSION_NAMESPACE(v1) { + namespace type { // FIXME operator== // FIXME operator!= <% GENERATION_LIMIT = 31 %> -template , typename A<%=i%> = void<%}%>> +template , typename A<%=i%><%}%>> struct tuple; template @@ -125,7 +128,7 @@ inline tuple<> make_tuple() } <%0.upto(GENERATION_LIMIT) {|i|%> template , typename A<%=j%><%}%>> -tuple, A<%=j%><%}%>> make_tuple(typename tuple_type::transparent_reference a0<%1.upto(i) {|j|%>, typename tuple_type>::transparent_reference a<%=j%><%}%>) +inline tuple, A<%=j%><%}%>> make_tuple(typename tuple_type::transparent_reference a0<%1.upto(i) {|j|%>, typename tuple_type>::transparent_reference a<%=j%><%}%>) { return tuple, A<%=j%><%}%>>(a0<%1.upto(i) {|j|%>, a<%=j%><%}%>); } @@ -141,7 +144,7 @@ inline object const& operator>> ( } <%0.upto(GENERATION_LIMIT) {|i|%> template , typename A<%=j%><%}%>> -object const& operator>> ( +inline object const& operator>> ( object const& o, type::tuple, A<%=j%><%}%>>& v) { if(o.type != type::ARRAY) { throw type_error(); } @@ -153,7 +156,7 @@ object const& operator>> ( <%}%> template -const packer& operator<< ( +inline const packer& operator<< ( packer& o, const type::tuple<>&) { o.pack_array(0); @@ -161,7 +164,7 @@ const packer& operator<< ( } <%0.upto(GENERATION_LIMIT) {|i|%> template , typename A<%=j%><%}%>> -const packer& operator<< ( +inline const packer& operator<< ( packer& o, const type::tuple, A<%=j%><%}%>>& v) { o.pack_array(<%=i+1%>); @@ -191,6 +194,8 @@ inline void operator<< ( } <%}%> +} // MSGPACK_API_VERSION_NAMESPACE(v1) + } // namespace msgpack diff --git a/erb/cpp03_msgpack_tuple_fwd.hpp.erb b/erb/cpp03_msgpack_tuple_fwd.hpp.erb new file mode 100644 index 00000000..99cefff0 --- /dev/null +++ b/erb/cpp03_msgpack_tuple_fwd.hpp.erb @@ -0,0 +1,125 @@ +// +// MessagePack for C++ static resolution routine +// +// Copyright (C) 2008-2013 FURUHASHI Sadayuki and KONDO Takatoshi +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#ifndef MSGPACK_CPP03_MSGPACK_TUPLE_FWD_HPP +#define MSGPACK_CPP03_MSGPACK_TUPLE_FWD_HPP + +#include "msgpack/versioning.hpp" +#include "msgpack/object_fwd.hpp" + +namespace msgpack { + +MSGPACK_API_VERSION_NAMESPACE(v1) { + +namespace type { + +// FIXME operator== +// FIXME operator!= +<% GENERATION_LIMIT = 31 %> + +template , typename A<%=i%> = void<%}%>> +struct tuple; + +template +struct tuple_element; + +template +struct const_tuple_element; + +template +struct tuple_type; + +<%0.upto(GENERATION_LIMIT) {|i|%> +<%0.upto(i) {|j|%> +template , typename A<%=k%><%}%>> +struct tuple_element, A<%=k%><%}%>>, <%=j%>>; +<%}%> +<%}%> + +<%0.upto(GENERATION_LIMIT) {|i|%> +<%0.upto(i) {|j|%> +template , typename A<%=k%><%}%>> +struct const_tuple_element, A<%=k%><%}%>>, <%=j%>>; +<%}%> +<%}%> + +template <> +struct tuple<>; +<%0.upto(GENERATION_LIMIT) {|i|%> +template , typename A<%=j%><%}%>> +struct tuple, A<%=j%><%}%>>; + +template , typename A<%=j%><%}%>> +typename type::tuple_element, A<%=j%><%}%>>, N>::reference get(type::tuple, A<%=j%><%}%>>& t); +template , typename A<%=j%><%}%>> +typename type::const_tuple_element, A<%=j%><%}%>>, N>::const_reference get(type::tuple, A<%=j%><%}%>> const& t); +<%}%> + +tuple<> make_tuple(); +<%0.upto(GENERATION_LIMIT) {|i|%> +template , typename A<%=j%><%}%>> +tuple, A<%=j%><%}%>> make_tuple(typename tuple_type::transparent_reference a0<%1.upto(i) {|j|%>, typename tuple_type>::transparent_reference a<%=j%><%}%>); +<%}%> + +} // namespace type + +object const& operator>> ( + object const& o, + type::tuple<>&); + +<%0.upto(GENERATION_LIMIT) {|i|%> +template , typename A<%=j%><%}%>> +object const& operator>> ( + object const& o, + type::tuple, A<%=j%><%}%>>& v); +<%}%> + +template +const packer& operator<< ( + packer& o, + const type::tuple<>&); + +<%0.upto(GENERATION_LIMIT) {|i|%> +template , typename A<%=j%><%}%>> +const packer& operator<< ( + packer& o, + const type::tuple, A<%=j%><%}%>>& v); +<%}%> + +void operator<< ( + object::with_zone& o, + const type::tuple<>&); +<%0.upto(GENERATION_LIMIT) {|i|%> +template , typename A<%=j%><%}%>> +void operator<< ( + object::with_zone& o, + const type::tuple, A<%=j%><%}%>>& v); +<%}%> + +} // MSGPACK_API_VERSION_NAMESPACE(v1) + +} // namespace msgpack + + +//std::ostream& operator<< (std::ostream& o, const msgpack::type::tuple<>& v); +//<%0.upto(GENERATION_LIMIT) {|i|%> +//template , typename A<%=j%><%}%>> +//std::ostream& operator<< (std::ostream& o, +// const msgpack::type::tuple, A<%=j%><%}%>>& v); +//<%}%> + +#endif // MSGPACK_CPP03_MSGPACK_TUPLE_FWD_HPP diff --git a/erb/cpp03_zone.hpp.erb b/erb/cpp03_zone.hpp.erb index da1656f5..9b16bb65 100644 --- a/erb/cpp03_zone.hpp.erb +++ b/erb/cpp03_zone.hpp.erb @@ -22,7 +22,7 @@ #include #include -#include "msgpack/cpp_config.hpp" +#include "msgpack/versioning.hpp" #ifndef MSGPACK_ZONE_CHUNK_SIZE #define MSGPACK_ZONE_CHUNK_SIZE 8192 @@ -35,6 +35,8 @@ <% GENERATION_LIMIT = 15 %> namespace msgpack { +MSGPACK_API_VERSION_NAMESPACE(v1) { + class zone { struct finalizer { finalizer(void (*func)(void*), void* data):m_func(func), m_data(data) {} @@ -301,6 +303,8 @@ T* zone::allocate(<%=(1..i).map{|j|"A#{j} a#{j}"}.join(', ')%>) } <%}%> +} // MSGPACK_API_VERSION_NAMESPACE(v1) + } // namespace msgpack #endif // MSGPACK_CPP03_ZONE_HPP diff --git a/include/msgpack/adaptor/bool.hpp b/include/msgpack/adaptor/bool.hpp index bdfb2408..df7e7ac7 100644 --- a/include/msgpack/adaptor/bool.hpp +++ b/include/msgpack/adaptor/bool.hpp @@ -18,11 +18,13 @@ #ifndef MSGPACK_TYPE_BOOL_HPP #define MSGPACK_TYPE_BOOL_HPP -#include "msgpack/object.hpp" +#include "msgpack/versioning.hpp" +#include "msgpack/object_fwd.hpp" #include namespace msgpack { +MSGPACK_API_VERSION_NAMESPACE(v1) { inline object const& operator>> (object const& o, bool& v) { @@ -49,6 +51,8 @@ inline void operator<< (object::with_zone& o, bool v) { static_cast(o) << v; } +} // MSGPACK_API_VERSION_NAMESPACE(v1) + } // namespace msgpack -#endif /* msgpack/type/bool.hpp */ +#endif // MSGPACK_TYPE_BOOL_HPP diff --git a/include/msgpack/adaptor/bool_fwd.hpp b/include/msgpack/adaptor/bool_fwd.hpp new file mode 100644 index 00000000..aecde517 --- /dev/null +++ b/include/msgpack/adaptor/bool_fwd.hpp @@ -0,0 +1,39 @@ +// +// MessagePack for C++ static resolution routine +// +// Copyright (C) 2008-2009 FURUHASHI Sadayuki +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#ifndef MSGPACK_TYPE_BOOL_FWD_HPP +#define MSGPACK_TYPE_BOOL_FWD_HPP + +#include "msgpack/versioning.hpp" +#include "msgpack/object_fwd.hpp" + +namespace msgpack { + +MSGPACK_API_VERSION_NAMESPACE(v1) { + +object const& operator>> (object const& o, bool& v); +template +packer& operator<< (packer& o, const bool& v); +void operator<< (object& o, bool v); +void operator<< (object::with_zone& o, bool v); + + +} // MSGPACK_API_VERSION_NAMESPACE(v1) + +} // namespace msgpack + +#endif // MSGPACK_TYPE_BOOL_FWD_HPP diff --git a/include/msgpack/adaptor/char_ptr.hpp b/include/msgpack/adaptor/char_ptr.hpp index 2ef6c98b..dca1acff 100644 --- a/include/msgpack/adaptor/char_ptr.hpp +++ b/include/msgpack/adaptor/char_ptr.hpp @@ -18,11 +18,14 @@ #ifndef MSGPACK_TYPE_CHAR_PTR_HPP #define MSGPACK_TYPE_CHAR_PTR_HPP -#include "msgpack/object.hpp" +#include "msgpack/versioning.hpp" +#include "msgpack/object_fwd.hpp" #include namespace msgpack { +MSGPACK_API_VERSION_NAMESPACE(v1) { + template inline packer& operator<< (packer& o, const char* v) { @@ -50,6 +53,7 @@ inline void operator<< (object& o, const char* v) o.via.str.size = static_cast(size); } +} // MSGPACK_API_VERSION_NAMESPACE(v1) } // namespace msgpack diff --git a/include/msgpack/adaptor/char_ptr_fwd.hpp b/include/msgpack/adaptor/char_ptr_fwd.hpp new file mode 100644 index 00000000..f6290e6a --- /dev/null +++ b/include/msgpack/adaptor/char_ptr_fwd.hpp @@ -0,0 +1,38 @@ +// +// MessagePack for C++ static resolution routine +// +// Copyright (C) 2014 KONDO Takatoshi +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#ifndef MSGPACK_TYPE_CHAR_PTR_FWD_HPP +#define MSGPACK_TYPE_CHAR_PTR_FWD_HPP + +#include "msgpack/versioning.hpp" +#include "msgpack/object_fwd.hpp" +#include + +namespace msgpack { + +MSGPACK_API_VERSION_NAMESPACE(v1) { + +template +packer& operator<< (packer& o, const char* v); +void operator<< (object::with_zone& o, const char* v); +void operator<< (object& o, const char* v); + +} // MSGPACK_API_VERSION_NAMESPACE(v1) + +} // namespace msgpack + +#endif // MSGPACK_TYPE_CHAR_PTR_FWD_HPP diff --git a/include/msgpack/adaptor/cpp11/array.hpp b/include/msgpack/adaptor/cpp11/array.hpp index 5c1cb3b0..6c932adf 100644 --- a/include/msgpack/adaptor/cpp11/array.hpp +++ b/include/msgpack/adaptor/cpp11/array.hpp @@ -19,13 +19,15 @@ #ifndef MSGPACK_CPP11_ARRAY_HPP #define MSGPACK_CPP11_ARRAY_HPP +#include "msgpack/versioning.hpp" +#include "msgpack/object_fwd.hpp" + #include -#include "msgpack/object.hpp" -#include "msgpack/cpp_config.hpp" - namespace msgpack { +MSGPACK_API_VERSION_NAMESPACE(v1) { + template inline object const& operator>> (object const& o, std::array& v) { if(o.type != type::ARRAY) { throw type_error(); } @@ -64,6 +66,7 @@ inline void operator<< (object::with_zone& o, const std::array& v) { } } +} // MSGPACK_API_VERSION_NAMESPACE(v1) } // namespace msgpack diff --git a/include/msgpack/adaptor/cpp11/array_char.hpp b/include/msgpack/adaptor/cpp11/array_char.hpp index a7cfcc2f..9df71bb1 100644 --- a/include/msgpack/adaptor/cpp11/array_char.hpp +++ b/include/msgpack/adaptor/cpp11/array_char.hpp @@ -18,11 +18,14 @@ #ifndef MSGPACK_TYPE_ARRAY_CHAR_HPP #define MSGPACK_TYPE_ARRAY_CHAR_HPP -#include "msgpack/object.hpp" +#include "msgpack/versioning.hpp" +#include "msgpack_fwd.hpp" #include namespace msgpack { +MSGPACK_API_VERSION_NAMESPACE(v1) { + template inline object const& operator>> (object const& o, std::array& v) { @@ -69,6 +72,8 @@ inline void operator<< (object::with_zone& o, const std::array& v) std::memcpy(ptr, v.data(), v.size()); } +} // MSGPACK_API_VERSION_NAMESPACE(v1) + } // namespace msgpack #endif // MSGPACK_TYPE_ARRAY_CHAR_HPP diff --git a/include/msgpack/adaptor/cpp11/array_char_fwd.hpp b/include/msgpack/adaptor/cpp11/array_char_fwd.hpp new file mode 100644 index 00000000..5f64e522 --- /dev/null +++ b/include/msgpack/adaptor/cpp11/array_char_fwd.hpp @@ -0,0 +1,45 @@ +// +// MessagePack for C++ static resolution routine +// +// Copyright (C) 2014 KONDO Takatoshi +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#ifndef MSGPACK_TYPE_ARRAY_CHAR_FWD_HPP +#define MSGPACK_TYPE_ARRAY_CHAR_FWD_HPP + +#include "msgpack/versioning.hpp" +#include "msgpack/object_fwd.hpp" +#include + +namespace msgpack { + +MSGPACK_API_VERSION_NAMESPACE(v1) { + +template +object const& operator>> (object const& o, std::array& v); + +template +packer& operator<< (packer& o, const std::array& v); + +template +void operator<< (object& o, const std::array& v); + +template +void operator<< (object::with_zone& o, const std::array& v); + +} // MSGPACK_API_VERSION_NAMESPACE(v1) + +} // namespace msgpack + +#endif // MSGPACK_TYPE_ARRAY_CHAR_FWD_HPP diff --git a/include/msgpack/adaptor/cpp11/array_fwd.hpp b/include/msgpack/adaptor/cpp11/array_fwd.hpp new file mode 100644 index 00000000..815694b4 --- /dev/null +++ b/include/msgpack/adaptor/cpp11/array_fwd.hpp @@ -0,0 +1,44 @@ +// +// MessagePack for C++ static resolution routine +// +// Copyright (C) 2014 KONDO Takatoshi +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#ifndef MSGPACK_CPP11_ARRAY_FWD_HPP +#define MSGPACK_CPP11_ARRAY_FWD_HPP + +#include "msgpack/versioning.hpp" +#include "msgpack/object_fwd.hpp" + +#include + +namespace msgpack { + +MSGPACK_API_VERSION_NAMESPACE(v1) { + +template +object const& operator>> (object const& o, std::array& v); + +template +packer& operator<< (packer& o, const std::array& v); + +template +void operator<< (object::with_zone& o, const std::array& v); + +} // MSGPACK_API_VERSION_NAMESPACE(v1) + +} // namespace msgpack + +#endif // MSGPACK_CPP11_ARRAY_FWD_HPP diff --git a/include/msgpack/adaptor/cpp11/forward_list.hpp b/include/msgpack/adaptor/cpp11/forward_list.hpp index 68e5ac22..dd78afd6 100644 --- a/include/msgpack/adaptor/cpp11/forward_list.hpp +++ b/include/msgpack/adaptor/cpp11/forward_list.hpp @@ -19,13 +19,15 @@ #ifndef MSGPACK_CPP11_FORWARD_LIST_HPP #define MSGPACK_CPP11_FORWARD_LIST_HPP +#include "msgpack/versioning.hpp" +#include "msgpack/object_fwd.hpp" + #include -#include "msgpack/object.hpp" -#include "msgpack/cpp_config.hpp" - namespace msgpack { +MSGPACK_API_VERSION_NAMESPACE(v1) { + template inline object const& operator>> (object const& o, std::forward_list& v) { @@ -64,6 +66,7 @@ inline void operator<< (object::with_zone& o, const std::forward_list& v) } } +} // MSGPACK_API_VERSION_NAMESPACE(v1) } // namespace msgpack diff --git a/include/msgpack/adaptor/cpp11/forward_list_fwd.hpp b/include/msgpack/adaptor/cpp11/forward_list_fwd.hpp new file mode 100644 index 00000000..47ca34a2 --- /dev/null +++ b/include/msgpack/adaptor/cpp11/forward_list_fwd.hpp @@ -0,0 +1,44 @@ +// +// MessagePack for C++ static resolution routine +// +// Copyright (C) 2014 KONDO Takatoshi +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#ifndef MSGPACK_CPP11_FORWARD_LIST_FWD_HPP +#define MSGPACK_CPP11_FORWARD_LIST_FWD_HPP + +#include "msgpack/versioning.hpp" +#include "msgpack/object_fwd.hpp" + +#include + +namespace msgpack { + +MSGPACK_API_VERSION_NAMESPACE(v1) { + +template +object const& operator>> (object const& o, std::forward_list& v); + +template +packer& operator<< (packer& o, const std::forward_list& v); + +template +void operator<< (object::with_zone& o, const std::forward_list& v); + +} // MSGPACK_API_VERSION_NAMESPACE(v1) + +} // namespace msgpack + +#endif // MSGPACK_CPP11_FORWARD_LIST_FWD_HPP diff --git a/include/msgpack/adaptor/cpp11/tuple.hpp b/include/msgpack/adaptor/cpp11/tuple.hpp index 463c11a3..b917360a 100644 --- a/include/msgpack/adaptor/cpp11/tuple.hpp +++ b/include/msgpack/adaptor/cpp11/tuple.hpp @@ -18,13 +18,15 @@ #ifndef MSGPACK_CPP11_TUPLE_HPP #define MSGPACK_CPP11_TUPLE_HPP +#include "msgpack/versioning.hpp" +#include "msgpack/object_fwd.hpp" + #include -#include "msgpack/object.hpp" -#include "msgpack/cpp_config.hpp" - namespace msgpack { +MSGPACK_API_VERSION_NAMESPACE(v1) { + // --- Pack ( from tuple to packer stream --- template struct StdTuplePacker { @@ -55,7 +57,7 @@ struct StdTuplePacker { template -const packer& operator<< ( +inline const packer& operator<< ( packer& o, const std::tuple& v) { o.pack_array(sizeof...(Args)); @@ -93,7 +95,7 @@ struct StdTupleConverter { }; template -object const& operator>> ( +inline object const& operator>> ( object const& o, std::tuple& v) { if(o.type != type::ARRAY) { throw type_error(); } @@ -140,6 +142,8 @@ inline void operator<< ( StdTupleToObjectWithZone::convert(o, v); } -} // msgpack +} // MSGPACK_API_VERSION_NAMESPACE(v1) + +} // namespace msgpack #endif // MSGPACK_CPP11_TUPLE_HPP diff --git a/include/msgpack/adaptor/cpp11/tuple_fwd.hpp b/include/msgpack/adaptor/cpp11/tuple_fwd.hpp new file mode 100644 index 00000000..f17ac289 --- /dev/null +++ b/include/msgpack/adaptor/cpp11/tuple_fwd.hpp @@ -0,0 +1,62 @@ +// +// MessagePack for C++ static resolution routine +// +// Copyright (C) 2008-2014 FURUHASHI Sadayuki and KONDO Takatoshi +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#ifndef MSGPACK_CPP11_TUPLE_FWD_HPP +#define MSGPACK_CPP11_TUPLE_FWD_HPP + +#include "msgpack/versioning.hpp" +#include "msgpack/object_fwd.hpp" + +#include + +namespace msgpack { + +MSGPACK_API_VERSION_NAMESPACE(v1) { + +// --- Pack ( from tuple to packer stream --- +template +struct StdTuplePacker; + +template +const packer& operator<< ( + packer& o, + const std::tuple& v); + +// --- Convert from tuple to object --- + +template +struct StdTupleConverter; + +template +object const& operator>> ( + object const& o, + std::tuple& v); + +// --- Convert from tuple to object with zone --- +template +struct StdTupleToObjectWithZone; + +template +void operator<< ( + object::with_zone& o, + std::tuple const& v); + +} // MSGPACK_API_VERSION_NAMESPACE(v1) + +} // namespace msgpack + +#endif // MSGPACK_CPP11_TUPLE_FWD_HPP diff --git a/include/msgpack/adaptor/deque.hpp b/include/msgpack/adaptor/deque.hpp index f5609c88..94bac923 100644 --- a/include/msgpack/adaptor/deque.hpp +++ b/include/msgpack/adaptor/deque.hpp @@ -18,11 +18,13 @@ #ifndef MSGPACK_TYPE_DEQUE_HPP #define MSGPACK_TYPE_DEQUE_HPP -#include "msgpack/object.hpp" +#include "msgpack/versioning.hpp" +#include "msgpack/object_fwd.hpp" #include namespace msgpack { +MSGPACK_API_VERSION_NAMESPACE(v1) { template inline object const& operator>> (object const& o, std::deque& v) @@ -70,6 +72,7 @@ inline void operator<< (object::with_zone& o, const std::deque& v) } } +} // MSGPACK_API_VERSION_NAMESPACE(v1) } // namespace msgpack diff --git a/include/msgpack/adaptor/deque_fwd.hpp b/include/msgpack/adaptor/deque_fwd.hpp new file mode 100644 index 00000000..81a88189 --- /dev/null +++ b/include/msgpack/adaptor/deque_fwd.hpp @@ -0,0 +1,40 @@ +// +// MessagePack for C++ static resolution routine +// +// Copyright (C) 2008-2014 FURUHASHI Sadayuki and KONDO Takatoshi +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#ifndef MSGPACK_TYPE_DEQUE_FWD_HPP +#define MSGPACK_TYPE_DEQUE_FWD_HPP + +#include "msgpack/versioning.hpp" +#include "msgpack/object_fwd.hpp" +#include + +namespace msgpack { + +MSGPACK_API_VERSION_NAMESPACE(v1) { + +template +object const& operator>> (object const& o, std::deque& v); +template +packer& operator<< (packer& o, const std::deque& v); +template +void operator<< (object::with_zone& o, const std::deque& v); + +} // MSGPACK_API_VERSION_NAMESPACE(v1) + +} // namespace msgpack + +#endif // MSGPACK_TYPE_DEQUE_FWD_HPP diff --git a/include/msgpack/adaptor/detail/cpp03_define.hpp b/include/msgpack/adaptor/detail/cpp03_define.hpp index 8e2b4b2a..3673da88 100644 --- a/include/msgpack/adaptor/detail/cpp03_define.hpp +++ b/include/msgpack/adaptor/detail/cpp03_define.hpp @@ -18,6 +18,10 @@ #ifndef MSGPACK_CPP03_DEFINE_HPP #define MSGPACK_CPP03_DEFINE_HPP +#include "msgpack/versioning.hpp" +#include "msgpack/adaptor/msgpack_tuple_fwd.hpp" +#include "msgpack/object_fwd.hpp" + #define MSGPACK_DEFINE(...) \ template \ void msgpack_pack(Packer& pk) const \ @@ -37,6 +41,7 @@ // MSGPACK_ADD_ENUM must be used in the global namespace. #define MSGPACK_ADD_ENUM(enum) \ namespace msgpack { \ + MSGPACK_API_VERSION_NAMESPACE(v1) { \ template <> \ inline object const& operator>> (object const& o, enum& v) \ { \ @@ -58,9 +63,11 @@ } \ }; \ } \ + } \ } namespace msgpack { +MSGPACK_API_VERSION_NAMESPACE(v1) { namespace type { @@ -3458,6 +3465,7 @@ define +template struct tuple; template @@ -10386,193 +10389,193 @@ inline tuple<> make_tuple() } template -tuple make_tuple(typename tuple_type::transparent_reference a0) +inline tuple make_tuple(typename tuple_type::transparent_reference a0) { return tuple(a0); } template -tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1) +inline tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1) { return tuple(a0, a1); } template -tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2) +inline tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2) { return tuple(a0, a1, a2); } template -tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3) +inline tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3) { return tuple(a0, a1, a2, a3); } template -tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4) +inline tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4) { return tuple(a0, a1, a2, a3, a4); } template -tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5) +inline tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5) { return tuple(a0, a1, a2, a3, a4, a5); } template -tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6) +inline tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6) { return tuple(a0, a1, a2, a3, a4, a5, a6); } template -tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6, typename tuple_type::transparent_reference a7) +inline tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6, typename tuple_type::transparent_reference a7) { return tuple(a0, a1, a2, a3, a4, a5, a6, a7); } template -tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6, typename tuple_type::transparent_reference a7, typename tuple_type::transparent_reference a8) +inline tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6, typename tuple_type::transparent_reference a7, typename tuple_type::transparent_reference a8) { return tuple(a0, a1, a2, a3, a4, a5, a6, a7, a8); } template -tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6, typename tuple_type::transparent_reference a7, typename tuple_type::transparent_reference a8, typename tuple_type::transparent_reference a9) +inline tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6, typename tuple_type::transparent_reference a7, typename tuple_type::transparent_reference a8, typename tuple_type::transparent_reference a9) { return tuple(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9); } template -tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6, typename tuple_type::transparent_reference a7, typename tuple_type::transparent_reference a8, typename tuple_type::transparent_reference a9, typename tuple_type::transparent_reference a10) +inline tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6, typename tuple_type::transparent_reference a7, typename tuple_type::transparent_reference a8, typename tuple_type::transparent_reference a9, typename tuple_type::transparent_reference a10) { return tuple(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10); } template -tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6, typename tuple_type::transparent_reference a7, typename tuple_type::transparent_reference a8, typename tuple_type::transparent_reference a9, typename tuple_type::transparent_reference a10, typename tuple_type::transparent_reference a11) +inline tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6, typename tuple_type::transparent_reference a7, typename tuple_type::transparent_reference a8, typename tuple_type::transparent_reference a9, typename tuple_type::transparent_reference a10, typename tuple_type::transparent_reference a11) { return tuple(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11); } template -tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6, typename tuple_type::transparent_reference a7, typename tuple_type::transparent_reference a8, typename tuple_type::transparent_reference a9, typename tuple_type::transparent_reference a10, typename tuple_type::transparent_reference a11, typename tuple_type::transparent_reference a12) +inline tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6, typename tuple_type::transparent_reference a7, typename tuple_type::transparent_reference a8, typename tuple_type::transparent_reference a9, typename tuple_type::transparent_reference a10, typename tuple_type::transparent_reference a11, typename tuple_type::transparent_reference a12) { return tuple(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12); } template -tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6, typename tuple_type::transparent_reference a7, typename tuple_type::transparent_reference a8, typename tuple_type::transparent_reference a9, typename tuple_type::transparent_reference a10, typename tuple_type::transparent_reference a11, typename tuple_type::transparent_reference a12, typename tuple_type::transparent_reference a13) +inline tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6, typename tuple_type::transparent_reference a7, typename tuple_type::transparent_reference a8, typename tuple_type::transparent_reference a9, typename tuple_type::transparent_reference a10, typename tuple_type::transparent_reference a11, typename tuple_type::transparent_reference a12, typename tuple_type::transparent_reference a13) { return tuple(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13); } template -tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6, typename tuple_type::transparent_reference a7, typename tuple_type::transparent_reference a8, typename tuple_type::transparent_reference a9, typename tuple_type::transparent_reference a10, typename tuple_type::transparent_reference a11, typename tuple_type::transparent_reference a12, typename tuple_type::transparent_reference a13, typename tuple_type::transparent_reference a14) +inline tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6, typename tuple_type::transparent_reference a7, typename tuple_type::transparent_reference a8, typename tuple_type::transparent_reference a9, typename tuple_type::transparent_reference a10, typename tuple_type::transparent_reference a11, typename tuple_type::transparent_reference a12, typename tuple_type::transparent_reference a13, typename tuple_type::transparent_reference a14) { return tuple(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14); } template -tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6, typename tuple_type::transparent_reference a7, typename tuple_type::transparent_reference a8, typename tuple_type::transparent_reference a9, typename tuple_type::transparent_reference a10, typename tuple_type::transparent_reference a11, typename tuple_type::transparent_reference a12, typename tuple_type::transparent_reference a13, typename tuple_type::transparent_reference a14, typename tuple_type::transparent_reference a15) +inline tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6, typename tuple_type::transparent_reference a7, typename tuple_type::transparent_reference a8, typename tuple_type::transparent_reference a9, typename tuple_type::transparent_reference a10, typename tuple_type::transparent_reference a11, typename tuple_type::transparent_reference a12, typename tuple_type::transparent_reference a13, typename tuple_type::transparent_reference a14, typename tuple_type::transparent_reference a15) { return tuple(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15); } template -tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6, typename tuple_type::transparent_reference a7, typename tuple_type::transparent_reference a8, typename tuple_type::transparent_reference a9, typename tuple_type::transparent_reference a10, typename tuple_type::transparent_reference a11, typename tuple_type::transparent_reference a12, typename tuple_type::transparent_reference a13, typename tuple_type::transparent_reference a14, typename tuple_type::transparent_reference a15, typename tuple_type::transparent_reference a16) +inline tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6, typename tuple_type::transparent_reference a7, typename tuple_type::transparent_reference a8, typename tuple_type::transparent_reference a9, typename tuple_type::transparent_reference a10, typename tuple_type::transparent_reference a11, typename tuple_type::transparent_reference a12, typename tuple_type::transparent_reference a13, typename tuple_type::transparent_reference a14, typename tuple_type::transparent_reference a15, typename tuple_type::transparent_reference a16) { return tuple(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16); } template -tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6, typename tuple_type::transparent_reference a7, typename tuple_type::transparent_reference a8, typename tuple_type::transparent_reference a9, typename tuple_type::transparent_reference a10, typename tuple_type::transparent_reference a11, typename tuple_type::transparent_reference a12, typename tuple_type::transparent_reference a13, typename tuple_type::transparent_reference a14, typename tuple_type::transparent_reference a15, typename tuple_type::transparent_reference a16, typename tuple_type::transparent_reference a17) +inline tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6, typename tuple_type::transparent_reference a7, typename tuple_type::transparent_reference a8, typename tuple_type::transparent_reference a9, typename tuple_type::transparent_reference a10, typename tuple_type::transparent_reference a11, typename tuple_type::transparent_reference a12, typename tuple_type::transparent_reference a13, typename tuple_type::transparent_reference a14, typename tuple_type::transparent_reference a15, typename tuple_type::transparent_reference a16, typename tuple_type::transparent_reference a17) { return tuple(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17); } template -tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6, typename tuple_type::transparent_reference a7, typename tuple_type::transparent_reference a8, typename tuple_type::transparent_reference a9, typename tuple_type::transparent_reference a10, typename tuple_type::transparent_reference a11, typename tuple_type::transparent_reference a12, typename tuple_type::transparent_reference a13, typename tuple_type::transparent_reference a14, typename tuple_type::transparent_reference a15, typename tuple_type::transparent_reference a16, typename tuple_type::transparent_reference a17, typename tuple_type::transparent_reference a18) +inline tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6, typename tuple_type::transparent_reference a7, typename tuple_type::transparent_reference a8, typename tuple_type::transparent_reference a9, typename tuple_type::transparent_reference a10, typename tuple_type::transparent_reference a11, typename tuple_type::transparent_reference a12, typename tuple_type::transparent_reference a13, typename tuple_type::transparent_reference a14, typename tuple_type::transparent_reference a15, typename tuple_type::transparent_reference a16, typename tuple_type::transparent_reference a17, typename tuple_type::transparent_reference a18) { return tuple(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18); } template -tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6, typename tuple_type::transparent_reference a7, typename tuple_type::transparent_reference a8, typename tuple_type::transparent_reference a9, typename tuple_type::transparent_reference a10, typename tuple_type::transparent_reference a11, typename tuple_type::transparent_reference a12, typename tuple_type::transparent_reference a13, typename tuple_type::transparent_reference a14, typename tuple_type::transparent_reference a15, typename tuple_type::transparent_reference a16, typename tuple_type::transparent_reference a17, typename tuple_type::transparent_reference a18, typename tuple_type::transparent_reference a19) +inline tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6, typename tuple_type::transparent_reference a7, typename tuple_type::transparent_reference a8, typename tuple_type::transparent_reference a9, typename tuple_type::transparent_reference a10, typename tuple_type::transparent_reference a11, typename tuple_type::transparent_reference a12, typename tuple_type::transparent_reference a13, typename tuple_type::transparent_reference a14, typename tuple_type::transparent_reference a15, typename tuple_type::transparent_reference a16, typename tuple_type::transparent_reference a17, typename tuple_type::transparent_reference a18, typename tuple_type::transparent_reference a19) { return tuple(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19); } template -tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6, typename tuple_type::transparent_reference a7, typename tuple_type::transparent_reference a8, typename tuple_type::transparent_reference a9, typename tuple_type::transparent_reference a10, typename tuple_type::transparent_reference a11, typename tuple_type::transparent_reference a12, typename tuple_type::transparent_reference a13, typename tuple_type::transparent_reference a14, typename tuple_type::transparent_reference a15, typename tuple_type::transparent_reference a16, typename tuple_type::transparent_reference a17, typename tuple_type::transparent_reference a18, typename tuple_type::transparent_reference a19, typename tuple_type::transparent_reference a20) +inline tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6, typename tuple_type::transparent_reference a7, typename tuple_type::transparent_reference a8, typename tuple_type::transparent_reference a9, typename tuple_type::transparent_reference a10, typename tuple_type::transparent_reference a11, typename tuple_type::transparent_reference a12, typename tuple_type::transparent_reference a13, typename tuple_type::transparent_reference a14, typename tuple_type::transparent_reference a15, typename tuple_type::transparent_reference a16, typename tuple_type::transparent_reference a17, typename tuple_type::transparent_reference a18, typename tuple_type::transparent_reference a19, typename tuple_type::transparent_reference a20) { return tuple(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); } template -tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6, typename tuple_type::transparent_reference a7, typename tuple_type::transparent_reference a8, typename tuple_type::transparent_reference a9, typename tuple_type::transparent_reference a10, typename tuple_type::transparent_reference a11, typename tuple_type::transparent_reference a12, typename tuple_type::transparent_reference a13, typename tuple_type::transparent_reference a14, typename tuple_type::transparent_reference a15, typename tuple_type::transparent_reference a16, typename tuple_type::transparent_reference a17, typename tuple_type::transparent_reference a18, typename tuple_type::transparent_reference a19, typename tuple_type::transparent_reference a20, typename tuple_type::transparent_reference a21) +inline tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6, typename tuple_type::transparent_reference a7, typename tuple_type::transparent_reference a8, typename tuple_type::transparent_reference a9, typename tuple_type::transparent_reference a10, typename tuple_type::transparent_reference a11, typename tuple_type::transparent_reference a12, typename tuple_type::transparent_reference a13, typename tuple_type::transparent_reference a14, typename tuple_type::transparent_reference a15, typename tuple_type::transparent_reference a16, typename tuple_type::transparent_reference a17, typename tuple_type::transparent_reference a18, typename tuple_type::transparent_reference a19, typename tuple_type::transparent_reference a20, typename tuple_type::transparent_reference a21) { return tuple(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21); } template -tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6, typename tuple_type::transparent_reference a7, typename tuple_type::transparent_reference a8, typename tuple_type::transparent_reference a9, typename tuple_type::transparent_reference a10, typename tuple_type::transparent_reference a11, typename tuple_type::transparent_reference a12, typename tuple_type::transparent_reference a13, typename tuple_type::transparent_reference a14, typename tuple_type::transparent_reference a15, typename tuple_type::transparent_reference a16, typename tuple_type::transparent_reference a17, typename tuple_type::transparent_reference a18, typename tuple_type::transparent_reference a19, typename tuple_type::transparent_reference a20, typename tuple_type::transparent_reference a21, typename tuple_type::transparent_reference a22) +inline tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6, typename tuple_type::transparent_reference a7, typename tuple_type::transparent_reference a8, typename tuple_type::transparent_reference a9, typename tuple_type::transparent_reference a10, typename tuple_type::transparent_reference a11, typename tuple_type::transparent_reference a12, typename tuple_type::transparent_reference a13, typename tuple_type::transparent_reference a14, typename tuple_type::transparent_reference a15, typename tuple_type::transparent_reference a16, typename tuple_type::transparent_reference a17, typename tuple_type::transparent_reference a18, typename tuple_type::transparent_reference a19, typename tuple_type::transparent_reference a20, typename tuple_type::transparent_reference a21, typename tuple_type::transparent_reference a22) { return tuple(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22); } template -tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6, typename tuple_type::transparent_reference a7, typename tuple_type::transparent_reference a8, typename tuple_type::transparent_reference a9, typename tuple_type::transparent_reference a10, typename tuple_type::transparent_reference a11, typename tuple_type::transparent_reference a12, typename tuple_type::transparent_reference a13, typename tuple_type::transparent_reference a14, typename tuple_type::transparent_reference a15, typename tuple_type::transparent_reference a16, typename tuple_type::transparent_reference a17, typename tuple_type::transparent_reference a18, typename tuple_type::transparent_reference a19, typename tuple_type::transparent_reference a20, typename tuple_type::transparent_reference a21, typename tuple_type::transparent_reference a22, typename tuple_type::transparent_reference a23) +inline tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6, typename tuple_type::transparent_reference a7, typename tuple_type::transparent_reference a8, typename tuple_type::transparent_reference a9, typename tuple_type::transparent_reference a10, typename tuple_type::transparent_reference a11, typename tuple_type::transparent_reference a12, typename tuple_type::transparent_reference a13, typename tuple_type::transparent_reference a14, typename tuple_type::transparent_reference a15, typename tuple_type::transparent_reference a16, typename tuple_type::transparent_reference a17, typename tuple_type::transparent_reference a18, typename tuple_type::transparent_reference a19, typename tuple_type::transparent_reference a20, typename tuple_type::transparent_reference a21, typename tuple_type::transparent_reference a22, typename tuple_type::transparent_reference a23) { return tuple(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23); } template -tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6, typename tuple_type::transparent_reference a7, typename tuple_type::transparent_reference a8, typename tuple_type::transparent_reference a9, typename tuple_type::transparent_reference a10, typename tuple_type::transparent_reference a11, typename tuple_type::transparent_reference a12, typename tuple_type::transparent_reference a13, typename tuple_type::transparent_reference a14, typename tuple_type::transparent_reference a15, typename tuple_type::transparent_reference a16, typename tuple_type::transparent_reference a17, typename tuple_type::transparent_reference a18, typename tuple_type::transparent_reference a19, typename tuple_type::transparent_reference a20, typename tuple_type::transparent_reference a21, typename tuple_type::transparent_reference a22, typename tuple_type::transparent_reference a23, typename tuple_type::transparent_reference a24) +inline tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6, typename tuple_type::transparent_reference a7, typename tuple_type::transparent_reference a8, typename tuple_type::transparent_reference a9, typename tuple_type::transparent_reference a10, typename tuple_type::transparent_reference a11, typename tuple_type::transparent_reference a12, typename tuple_type::transparent_reference a13, typename tuple_type::transparent_reference a14, typename tuple_type::transparent_reference a15, typename tuple_type::transparent_reference a16, typename tuple_type::transparent_reference a17, typename tuple_type::transparent_reference a18, typename tuple_type::transparent_reference a19, typename tuple_type::transparent_reference a20, typename tuple_type::transparent_reference a21, typename tuple_type::transparent_reference a22, typename tuple_type::transparent_reference a23, typename tuple_type::transparent_reference a24) { return tuple(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24); } template -tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6, typename tuple_type::transparent_reference a7, typename tuple_type::transparent_reference a8, typename tuple_type::transparent_reference a9, typename tuple_type::transparent_reference a10, typename tuple_type::transparent_reference a11, typename tuple_type::transparent_reference a12, typename tuple_type::transparent_reference a13, typename tuple_type::transparent_reference a14, typename tuple_type::transparent_reference a15, typename tuple_type::transparent_reference a16, typename tuple_type::transparent_reference a17, typename tuple_type::transparent_reference a18, typename tuple_type::transparent_reference a19, typename tuple_type::transparent_reference a20, typename tuple_type::transparent_reference a21, typename tuple_type::transparent_reference a22, typename tuple_type::transparent_reference a23, typename tuple_type::transparent_reference a24, typename tuple_type::transparent_reference a25) +inline tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6, typename tuple_type::transparent_reference a7, typename tuple_type::transparent_reference a8, typename tuple_type::transparent_reference a9, typename tuple_type::transparent_reference a10, typename tuple_type::transparent_reference a11, typename tuple_type::transparent_reference a12, typename tuple_type::transparent_reference a13, typename tuple_type::transparent_reference a14, typename tuple_type::transparent_reference a15, typename tuple_type::transparent_reference a16, typename tuple_type::transparent_reference a17, typename tuple_type::transparent_reference a18, typename tuple_type::transparent_reference a19, typename tuple_type::transparent_reference a20, typename tuple_type::transparent_reference a21, typename tuple_type::transparent_reference a22, typename tuple_type::transparent_reference a23, typename tuple_type::transparent_reference a24, typename tuple_type::transparent_reference a25) { return tuple(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25); } template -tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6, typename tuple_type::transparent_reference a7, typename tuple_type::transparent_reference a8, typename tuple_type::transparent_reference a9, typename tuple_type::transparent_reference a10, typename tuple_type::transparent_reference a11, typename tuple_type::transparent_reference a12, typename tuple_type::transparent_reference a13, typename tuple_type::transparent_reference a14, typename tuple_type::transparent_reference a15, typename tuple_type::transparent_reference a16, typename tuple_type::transparent_reference a17, typename tuple_type::transparent_reference a18, typename tuple_type::transparent_reference a19, typename tuple_type::transparent_reference a20, typename tuple_type::transparent_reference a21, typename tuple_type::transparent_reference a22, typename tuple_type::transparent_reference a23, typename tuple_type::transparent_reference a24, typename tuple_type::transparent_reference a25, typename tuple_type::transparent_reference a26) +inline tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6, typename tuple_type::transparent_reference a7, typename tuple_type::transparent_reference a8, typename tuple_type::transparent_reference a9, typename tuple_type::transparent_reference a10, typename tuple_type::transparent_reference a11, typename tuple_type::transparent_reference a12, typename tuple_type::transparent_reference a13, typename tuple_type::transparent_reference a14, typename tuple_type::transparent_reference a15, typename tuple_type::transparent_reference a16, typename tuple_type::transparent_reference a17, typename tuple_type::transparent_reference a18, typename tuple_type::transparent_reference a19, typename tuple_type::transparent_reference a20, typename tuple_type::transparent_reference a21, typename tuple_type::transparent_reference a22, typename tuple_type::transparent_reference a23, typename tuple_type::transparent_reference a24, typename tuple_type::transparent_reference a25, typename tuple_type::transparent_reference a26) { return tuple(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26); } template -tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6, typename tuple_type::transparent_reference a7, typename tuple_type::transparent_reference a8, typename tuple_type::transparent_reference a9, typename tuple_type::transparent_reference a10, typename tuple_type::transparent_reference a11, typename tuple_type::transparent_reference a12, typename tuple_type::transparent_reference a13, typename tuple_type::transparent_reference a14, typename tuple_type::transparent_reference a15, typename tuple_type::transparent_reference a16, typename tuple_type::transparent_reference a17, typename tuple_type::transparent_reference a18, typename tuple_type::transparent_reference a19, typename tuple_type::transparent_reference a20, typename tuple_type::transparent_reference a21, typename tuple_type::transparent_reference a22, typename tuple_type::transparent_reference a23, typename tuple_type::transparent_reference a24, typename tuple_type::transparent_reference a25, typename tuple_type::transparent_reference a26, typename tuple_type::transparent_reference a27) +inline tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6, typename tuple_type::transparent_reference a7, typename tuple_type::transparent_reference a8, typename tuple_type::transparent_reference a9, typename tuple_type::transparent_reference a10, typename tuple_type::transparent_reference a11, typename tuple_type::transparent_reference a12, typename tuple_type::transparent_reference a13, typename tuple_type::transparent_reference a14, typename tuple_type::transparent_reference a15, typename tuple_type::transparent_reference a16, typename tuple_type::transparent_reference a17, typename tuple_type::transparent_reference a18, typename tuple_type::transparent_reference a19, typename tuple_type::transparent_reference a20, typename tuple_type::transparent_reference a21, typename tuple_type::transparent_reference a22, typename tuple_type::transparent_reference a23, typename tuple_type::transparent_reference a24, typename tuple_type::transparent_reference a25, typename tuple_type::transparent_reference a26, typename tuple_type::transparent_reference a27) { return tuple(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27); } template -tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6, typename tuple_type::transparent_reference a7, typename tuple_type::transparent_reference a8, typename tuple_type::transparent_reference a9, typename tuple_type::transparent_reference a10, typename tuple_type::transparent_reference a11, typename tuple_type::transparent_reference a12, typename tuple_type::transparent_reference a13, typename tuple_type::transparent_reference a14, typename tuple_type::transparent_reference a15, typename tuple_type::transparent_reference a16, typename tuple_type::transparent_reference a17, typename tuple_type::transparent_reference a18, typename tuple_type::transparent_reference a19, typename tuple_type::transparent_reference a20, typename tuple_type::transparent_reference a21, typename tuple_type::transparent_reference a22, typename tuple_type::transparent_reference a23, typename tuple_type::transparent_reference a24, typename tuple_type::transparent_reference a25, typename tuple_type::transparent_reference a26, typename tuple_type::transparent_reference a27, typename tuple_type::transparent_reference a28) +inline tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6, typename tuple_type::transparent_reference a7, typename tuple_type::transparent_reference a8, typename tuple_type::transparent_reference a9, typename tuple_type::transparent_reference a10, typename tuple_type::transparent_reference a11, typename tuple_type::transparent_reference a12, typename tuple_type::transparent_reference a13, typename tuple_type::transparent_reference a14, typename tuple_type::transparent_reference a15, typename tuple_type::transparent_reference a16, typename tuple_type::transparent_reference a17, typename tuple_type::transparent_reference a18, typename tuple_type::transparent_reference a19, typename tuple_type::transparent_reference a20, typename tuple_type::transparent_reference a21, typename tuple_type::transparent_reference a22, typename tuple_type::transparent_reference a23, typename tuple_type::transparent_reference a24, typename tuple_type::transparent_reference a25, typename tuple_type::transparent_reference a26, typename tuple_type::transparent_reference a27, typename tuple_type::transparent_reference a28) { return tuple(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28); } template -tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6, typename tuple_type::transparent_reference a7, typename tuple_type::transparent_reference a8, typename tuple_type::transparent_reference a9, typename tuple_type::transparent_reference a10, typename tuple_type::transparent_reference a11, typename tuple_type::transparent_reference a12, typename tuple_type::transparent_reference a13, typename tuple_type::transparent_reference a14, typename tuple_type::transparent_reference a15, typename tuple_type::transparent_reference a16, typename tuple_type::transparent_reference a17, typename tuple_type::transparent_reference a18, typename tuple_type::transparent_reference a19, typename tuple_type::transparent_reference a20, typename tuple_type::transparent_reference a21, typename tuple_type::transparent_reference a22, typename tuple_type::transparent_reference a23, typename tuple_type::transparent_reference a24, typename tuple_type::transparent_reference a25, typename tuple_type::transparent_reference a26, typename tuple_type::transparent_reference a27, typename tuple_type::transparent_reference a28, typename tuple_type::transparent_reference a29) +inline tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6, typename tuple_type::transparent_reference a7, typename tuple_type::transparent_reference a8, typename tuple_type::transparent_reference a9, typename tuple_type::transparent_reference a10, typename tuple_type::transparent_reference a11, typename tuple_type::transparent_reference a12, typename tuple_type::transparent_reference a13, typename tuple_type::transparent_reference a14, typename tuple_type::transparent_reference a15, typename tuple_type::transparent_reference a16, typename tuple_type::transparent_reference a17, typename tuple_type::transparent_reference a18, typename tuple_type::transparent_reference a19, typename tuple_type::transparent_reference a20, typename tuple_type::transparent_reference a21, typename tuple_type::transparent_reference a22, typename tuple_type::transparent_reference a23, typename tuple_type::transparent_reference a24, typename tuple_type::transparent_reference a25, typename tuple_type::transparent_reference a26, typename tuple_type::transparent_reference a27, typename tuple_type::transparent_reference a28, typename tuple_type::transparent_reference a29) { return tuple(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29); } template -tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6, typename tuple_type::transparent_reference a7, typename tuple_type::transparent_reference a8, typename tuple_type::transparent_reference a9, typename tuple_type::transparent_reference a10, typename tuple_type::transparent_reference a11, typename tuple_type::transparent_reference a12, typename tuple_type::transparent_reference a13, typename tuple_type::transparent_reference a14, typename tuple_type::transparent_reference a15, typename tuple_type::transparent_reference a16, typename tuple_type::transparent_reference a17, typename tuple_type::transparent_reference a18, typename tuple_type::transparent_reference a19, typename tuple_type::transparent_reference a20, typename tuple_type::transparent_reference a21, typename tuple_type::transparent_reference a22, typename tuple_type::transparent_reference a23, typename tuple_type::transparent_reference a24, typename tuple_type::transparent_reference a25, typename tuple_type::transparent_reference a26, typename tuple_type::transparent_reference a27, typename tuple_type::transparent_reference a28, typename tuple_type::transparent_reference a29, typename tuple_type::transparent_reference a30) +inline tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6, typename tuple_type::transparent_reference a7, typename tuple_type::transparent_reference a8, typename tuple_type::transparent_reference a9, typename tuple_type::transparent_reference a10, typename tuple_type::transparent_reference a11, typename tuple_type::transparent_reference a12, typename tuple_type::transparent_reference a13, typename tuple_type::transparent_reference a14, typename tuple_type::transparent_reference a15, typename tuple_type::transparent_reference a16, typename tuple_type::transparent_reference a17, typename tuple_type::transparent_reference a18, typename tuple_type::transparent_reference a19, typename tuple_type::transparent_reference a20, typename tuple_type::transparent_reference a21, typename tuple_type::transparent_reference a22, typename tuple_type::transparent_reference a23, typename tuple_type::transparent_reference a24, typename tuple_type::transparent_reference a25, typename tuple_type::transparent_reference a26, typename tuple_type::transparent_reference a27, typename tuple_type::transparent_reference a28, typename tuple_type::transparent_reference a29, typename tuple_type::transparent_reference a30) { return tuple(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30); } template -tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6, typename tuple_type::transparent_reference a7, typename tuple_type::transparent_reference a8, typename tuple_type::transparent_reference a9, typename tuple_type::transparent_reference a10, typename tuple_type::transparent_reference a11, typename tuple_type::transparent_reference a12, typename tuple_type::transparent_reference a13, typename tuple_type::transparent_reference a14, typename tuple_type::transparent_reference a15, typename tuple_type::transparent_reference a16, typename tuple_type::transparent_reference a17, typename tuple_type::transparent_reference a18, typename tuple_type::transparent_reference a19, typename tuple_type::transparent_reference a20, typename tuple_type::transparent_reference a21, typename tuple_type::transparent_reference a22, typename tuple_type::transparent_reference a23, typename tuple_type::transparent_reference a24, typename tuple_type::transparent_reference a25, typename tuple_type::transparent_reference a26, typename tuple_type::transparent_reference a27, typename tuple_type::transparent_reference a28, typename tuple_type::transparent_reference a29, typename tuple_type::transparent_reference a30, typename tuple_type::transparent_reference a31) +inline tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6, typename tuple_type::transparent_reference a7, typename tuple_type::transparent_reference a8, typename tuple_type::transparent_reference a9, typename tuple_type::transparent_reference a10, typename tuple_type::transparent_reference a11, typename tuple_type::transparent_reference a12, typename tuple_type::transparent_reference a13, typename tuple_type::transparent_reference a14, typename tuple_type::transparent_reference a15, typename tuple_type::transparent_reference a16, typename tuple_type::transparent_reference a17, typename tuple_type::transparent_reference a18, typename tuple_type::transparent_reference a19, typename tuple_type::transparent_reference a20, typename tuple_type::transparent_reference a21, typename tuple_type::transparent_reference a22, typename tuple_type::transparent_reference a23, typename tuple_type::transparent_reference a24, typename tuple_type::transparent_reference a25, typename tuple_type::transparent_reference a26, typename tuple_type::transparent_reference a27, typename tuple_type::transparent_reference a28, typename tuple_type::transparent_reference a29, typename tuple_type::transparent_reference a30, typename tuple_type::transparent_reference a31) { return tuple(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31); } @@ -10588,7 +10591,7 @@ inline object const& operator>> ( } template -object const& operator>> ( +inline object const& operator>> ( object const& o, type::tuple& v) { if(o.type != type::ARRAY) { throw type_error(); } @@ -10599,7 +10602,7 @@ object const& operator>> ( } template -object const& operator>> ( +inline object const& operator>> ( object const& o, type::tuple& v) { if(o.type != type::ARRAY) { throw type_error(); } @@ -10611,7 +10614,7 @@ object const& operator>> ( } template -object const& operator>> ( +inline object const& operator>> ( object const& o, type::tuple& v) { if(o.type != type::ARRAY) { throw type_error(); } @@ -10624,7 +10627,7 @@ object const& operator>> ( } template -object const& operator>> ( +inline object const& operator>> ( object const& o, type::tuple& v) { if(o.type != type::ARRAY) { throw type_error(); } @@ -10638,7 +10641,7 @@ object const& operator>> ( } template -object const& operator>> ( +inline object const& operator>> ( object const& o, type::tuple& v) { if(o.type != type::ARRAY) { throw type_error(); } @@ -10653,7 +10656,7 @@ object const& operator>> ( } template -object const& operator>> ( +inline object const& operator>> ( object const& o, type::tuple& v) { if(o.type != type::ARRAY) { throw type_error(); } @@ -10669,7 +10672,7 @@ object const& operator>> ( } template -object const& operator>> ( +inline object const& operator>> ( object const& o, type::tuple& v) { if(o.type != type::ARRAY) { throw type_error(); } @@ -10686,7 +10689,7 @@ object const& operator>> ( } template -object const& operator>> ( +inline object const& operator>> ( object const& o, type::tuple& v) { if(o.type != type::ARRAY) { throw type_error(); } @@ -10704,7 +10707,7 @@ object const& operator>> ( } template -object const& operator>> ( +inline object const& operator>> ( object const& o, type::tuple& v) { if(o.type != type::ARRAY) { throw type_error(); } @@ -10723,7 +10726,7 @@ object const& operator>> ( } template -object const& operator>> ( +inline object const& operator>> ( object const& o, type::tuple& v) { if(o.type != type::ARRAY) { throw type_error(); } @@ -10743,7 +10746,7 @@ object const& operator>> ( } template -object const& operator>> ( +inline object const& operator>> ( object const& o, type::tuple& v) { if(o.type != type::ARRAY) { throw type_error(); } @@ -10764,7 +10767,7 @@ object const& operator>> ( } template -object const& operator>> ( +inline object const& operator>> ( object const& o, type::tuple& v) { if(o.type != type::ARRAY) { throw type_error(); } @@ -10786,7 +10789,7 @@ object const& operator>> ( } template -object const& operator>> ( +inline object const& operator>> ( object const& o, type::tuple& v) { if(o.type != type::ARRAY) { throw type_error(); } @@ -10809,7 +10812,7 @@ object const& operator>> ( } template -object const& operator>> ( +inline object const& operator>> ( object const& o, type::tuple& v) { if(o.type != type::ARRAY) { throw type_error(); } @@ -10833,7 +10836,7 @@ object const& operator>> ( } template -object const& operator>> ( +inline object const& operator>> ( object const& o, type::tuple& v) { if(o.type != type::ARRAY) { throw type_error(); } @@ -10858,7 +10861,7 @@ object const& operator>> ( } template -object const& operator>> ( +inline object const& operator>> ( object const& o, type::tuple& v) { if(o.type != type::ARRAY) { throw type_error(); } @@ -10884,7 +10887,7 @@ object const& operator>> ( } template -object const& operator>> ( +inline object const& operator>> ( object const& o, type::tuple& v) { if(o.type != type::ARRAY) { throw type_error(); } @@ -10911,7 +10914,7 @@ object const& operator>> ( } template -object const& operator>> ( +inline object const& operator>> ( object const& o, type::tuple& v) { if(o.type != type::ARRAY) { throw type_error(); } @@ -10939,7 +10942,7 @@ object const& operator>> ( } template -object const& operator>> ( +inline object const& operator>> ( object const& o, type::tuple& v) { if(o.type != type::ARRAY) { throw type_error(); } @@ -10968,7 +10971,7 @@ object const& operator>> ( } template -object const& operator>> ( +inline object const& operator>> ( object const& o, type::tuple& v) { if(o.type != type::ARRAY) { throw type_error(); } @@ -10998,7 +11001,7 @@ object const& operator>> ( } template -object const& operator>> ( +inline object const& operator>> ( object const& o, type::tuple& v) { if(o.type != type::ARRAY) { throw type_error(); } @@ -11029,7 +11032,7 @@ object const& operator>> ( } template -object const& operator>> ( +inline object const& operator>> ( object const& o, type::tuple& v) { if(o.type != type::ARRAY) { throw type_error(); } @@ -11061,7 +11064,7 @@ object const& operator>> ( } template -object const& operator>> ( +inline object const& operator>> ( object const& o, type::tuple& v) { if(o.type != type::ARRAY) { throw type_error(); } @@ -11094,7 +11097,7 @@ object const& operator>> ( } template -object const& operator>> ( +inline object const& operator>> ( object const& o, type::tuple& v) { if(o.type != type::ARRAY) { throw type_error(); } @@ -11128,7 +11131,7 @@ object const& operator>> ( } template -object const& operator>> ( +inline object const& operator>> ( object const& o, type::tuple& v) { if(o.type != type::ARRAY) { throw type_error(); } @@ -11163,7 +11166,7 @@ object const& operator>> ( } template -object const& operator>> ( +inline object const& operator>> ( object const& o, type::tuple& v) { if(o.type != type::ARRAY) { throw type_error(); } @@ -11199,7 +11202,7 @@ object const& operator>> ( } template -object const& operator>> ( +inline object const& operator>> ( object const& o, type::tuple& v) { if(o.type != type::ARRAY) { throw type_error(); } @@ -11236,7 +11239,7 @@ object const& operator>> ( } template -object const& operator>> ( +inline object const& operator>> ( object const& o, type::tuple& v) { if(o.type != type::ARRAY) { throw type_error(); } @@ -11274,7 +11277,7 @@ object const& operator>> ( } template -object const& operator>> ( +inline object const& operator>> ( object const& o, type::tuple& v) { if(o.type != type::ARRAY) { throw type_error(); } @@ -11313,7 +11316,7 @@ object const& operator>> ( } template -object const& operator>> ( +inline object const& operator>> ( object const& o, type::tuple& v) { if(o.type != type::ARRAY) { throw type_error(); } @@ -11353,7 +11356,7 @@ object const& operator>> ( } template -object const& operator>> ( +inline object const& operator>> ( object const& o, type::tuple& v) { if(o.type != type::ARRAY) { throw type_error(); } @@ -11394,7 +11397,7 @@ object const& operator>> ( } template -object const& operator>> ( +inline object const& operator>> ( object const& o, type::tuple& v) { if(o.type != type::ARRAY) { throw type_error(); } @@ -11437,7 +11440,7 @@ object const& operator>> ( template -const packer& operator<< ( +inline const packer& operator<< ( packer& o, const type::tuple<>&) { o.pack_array(0); @@ -11445,7 +11448,7 @@ const packer& operator<< ( } template -const packer& operator<< ( +inline const packer& operator<< ( packer& o, const type::tuple& v) { o.pack_array(1); @@ -11455,7 +11458,7 @@ const packer& operator<< ( } template -const packer& operator<< ( +inline const packer& operator<< ( packer& o, const type::tuple& v) { o.pack_array(2); @@ -11466,7 +11469,7 @@ const packer& operator<< ( } template -const packer& operator<< ( +inline const packer& operator<< ( packer& o, const type::tuple& v) { o.pack_array(3); @@ -11478,7 +11481,7 @@ const packer& operator<< ( } template -const packer& operator<< ( +inline const packer& operator<< ( packer& o, const type::tuple& v) { o.pack_array(4); @@ -11491,7 +11494,7 @@ const packer& operator<< ( } template -const packer& operator<< ( +inline const packer& operator<< ( packer& o, const type::tuple& v) { o.pack_array(5); @@ -11505,7 +11508,7 @@ const packer& operator<< ( } template -const packer& operator<< ( +inline const packer& operator<< ( packer& o, const type::tuple& v) { o.pack_array(6); @@ -11520,7 +11523,7 @@ const packer& operator<< ( } template -const packer& operator<< ( +inline const packer& operator<< ( packer& o, const type::tuple& v) { o.pack_array(7); @@ -11536,7 +11539,7 @@ const packer& operator<< ( } template -const packer& operator<< ( +inline const packer& operator<< ( packer& o, const type::tuple& v) { o.pack_array(8); @@ -11553,7 +11556,7 @@ const packer& operator<< ( } template -const packer& operator<< ( +inline const packer& operator<< ( packer& o, const type::tuple& v) { o.pack_array(9); @@ -11571,7 +11574,7 @@ const packer& operator<< ( } template -const packer& operator<< ( +inline const packer& operator<< ( packer& o, const type::tuple& v) { o.pack_array(10); @@ -11590,7 +11593,7 @@ const packer& operator<< ( } template -const packer& operator<< ( +inline const packer& operator<< ( packer& o, const type::tuple& v) { o.pack_array(11); @@ -11610,7 +11613,7 @@ const packer& operator<< ( } template -const packer& operator<< ( +inline const packer& operator<< ( packer& o, const type::tuple& v) { o.pack_array(12); @@ -11631,7 +11634,7 @@ const packer& operator<< ( } template -const packer& operator<< ( +inline const packer& operator<< ( packer& o, const type::tuple& v) { o.pack_array(13); @@ -11653,7 +11656,7 @@ const packer& operator<< ( } template -const packer& operator<< ( +inline const packer& operator<< ( packer& o, const type::tuple& v) { o.pack_array(14); @@ -11676,7 +11679,7 @@ const packer& operator<< ( } template -const packer& operator<< ( +inline const packer& operator<< ( packer& o, const type::tuple& v) { o.pack_array(15); @@ -11700,7 +11703,7 @@ const packer& operator<< ( } template -const packer& operator<< ( +inline const packer& operator<< ( packer& o, const type::tuple& v) { o.pack_array(16); @@ -11725,7 +11728,7 @@ const packer& operator<< ( } template -const packer& operator<< ( +inline const packer& operator<< ( packer& o, const type::tuple& v) { o.pack_array(17); @@ -11751,7 +11754,7 @@ const packer& operator<< ( } template -const packer& operator<< ( +inline const packer& operator<< ( packer& o, const type::tuple& v) { o.pack_array(18); @@ -11778,7 +11781,7 @@ const packer& operator<< ( } template -const packer& operator<< ( +inline const packer& operator<< ( packer& o, const type::tuple& v) { o.pack_array(19); @@ -11806,7 +11809,7 @@ const packer& operator<< ( } template -const packer& operator<< ( +inline const packer& operator<< ( packer& o, const type::tuple& v) { o.pack_array(20); @@ -11835,7 +11838,7 @@ const packer& operator<< ( } template -const packer& operator<< ( +inline const packer& operator<< ( packer& o, const type::tuple& v) { o.pack_array(21); @@ -11865,7 +11868,7 @@ const packer& operator<< ( } template -const packer& operator<< ( +inline const packer& operator<< ( packer& o, const type::tuple& v) { o.pack_array(22); @@ -11896,7 +11899,7 @@ const packer& operator<< ( } template -const packer& operator<< ( +inline const packer& operator<< ( packer& o, const type::tuple& v) { o.pack_array(23); @@ -11928,7 +11931,7 @@ const packer& operator<< ( } template -const packer& operator<< ( +inline const packer& operator<< ( packer& o, const type::tuple& v) { o.pack_array(24); @@ -11961,7 +11964,7 @@ const packer& operator<< ( } template -const packer& operator<< ( +inline const packer& operator<< ( packer& o, const type::tuple& v) { o.pack_array(25); @@ -11995,7 +11998,7 @@ const packer& operator<< ( } template -const packer& operator<< ( +inline const packer& operator<< ( packer& o, const type::tuple& v) { o.pack_array(26); @@ -12030,7 +12033,7 @@ const packer& operator<< ( } template -const packer& operator<< ( +inline const packer& operator<< ( packer& o, const type::tuple& v) { o.pack_array(27); @@ -12066,7 +12069,7 @@ const packer& operator<< ( } template -const packer& operator<< ( +inline const packer& operator<< ( packer& o, const type::tuple& v) { o.pack_array(28); @@ -12103,7 +12106,7 @@ const packer& operator<< ( } template -const packer& operator<< ( +inline const packer& operator<< ( packer& o, const type::tuple& v) { o.pack_array(29); @@ -12141,7 +12144,7 @@ const packer& operator<< ( } template -const packer& operator<< ( +inline const packer& operator<< ( packer& o, const type::tuple& v) { o.pack_array(30); @@ -12180,7 +12183,7 @@ const packer& operator<< ( } template -const packer& operator<< ( +inline const packer& operator<< ( packer& o, const type::tuple& v) { o.pack_array(31); @@ -12220,7 +12223,7 @@ const packer& operator<< ( } template -const packer& operator<< ( +inline const packer& operator<< ( packer& o, const type::tuple& v) { o.pack_array(32); @@ -13118,6 +13121,8 @@ inline void operator<< ( } +} // MSGPACK_API_VERSION_NAMESPACE(v1) + } // namespace msgpack diff --git a/include/msgpack/adaptor/detail/cpp03_msgpack_tuple_fwd.hpp b/include/msgpack/adaptor/detail/cpp03_msgpack_tuple_fwd.hpp new file mode 100644 index 00000000..da8a9f26 --- /dev/null +++ b/include/msgpack/adaptor/detail/cpp03_msgpack_tuple_fwd.hpp @@ -0,0 +1,4341 @@ +// +// MessagePack for C++ static resolution routine +// +// Copyright (C) 2008-2013 FURUHASHI Sadayuki and KONDO Takatoshi +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#ifndef MSGPACK_CPP03_MSGPACK_TUPLE_FWD_HPP +#define MSGPACK_CPP03_MSGPACK_TUPLE_FWD_HPP + +#include "msgpack/versioning.hpp" +#include "msgpack/object_fwd.hpp" + +namespace msgpack { + +MSGPACK_API_VERSION_NAMESPACE(v1) { + +namespace type { + +// FIXME operator== +// FIXME operator!= + + +template +struct tuple; + +template +struct tuple_element; + +template +struct const_tuple_element; + +template +struct tuple_type; + + + +template +struct tuple_element, 0>; + + + +template +struct tuple_element, 0>; + +template +struct tuple_element, 1>; + + + +template +struct tuple_element, 0>; + +template +struct tuple_element, 1>; + +template +struct tuple_element, 2>; + + + +template +struct tuple_element, 0>; + +template +struct tuple_element, 1>; + +template +struct tuple_element, 2>; + +template +struct tuple_element, 3>; + + + +template +struct tuple_element, 0>; + +template +struct tuple_element, 1>; + +template +struct tuple_element, 2>; + +template +struct tuple_element, 3>; + +template +struct tuple_element, 4>; + + + +template +struct tuple_element, 0>; + +template +struct tuple_element, 1>; + +template +struct tuple_element, 2>; + +template +struct tuple_element, 3>; + +template +struct tuple_element, 4>; + +template +struct tuple_element, 5>; + + + +template +struct tuple_element, 0>; + +template +struct tuple_element, 1>; + +template +struct tuple_element, 2>; + +template +struct tuple_element, 3>; + +template +struct tuple_element, 4>; + +template +struct tuple_element, 5>; + +template +struct tuple_element, 6>; + + + +template +struct tuple_element, 0>; + +template +struct tuple_element, 1>; + +template +struct tuple_element, 2>; + +template +struct tuple_element, 3>; + +template +struct tuple_element, 4>; + +template +struct tuple_element, 5>; + +template +struct tuple_element, 6>; + +template +struct tuple_element, 7>; + + + +template +struct tuple_element, 0>; + +template +struct tuple_element, 1>; + +template +struct tuple_element, 2>; + +template +struct tuple_element, 3>; + +template +struct tuple_element, 4>; + +template +struct tuple_element, 5>; + +template +struct tuple_element, 6>; + +template +struct tuple_element, 7>; + +template +struct tuple_element, 8>; + + + +template +struct tuple_element, 0>; + +template +struct tuple_element, 1>; + +template +struct tuple_element, 2>; + +template +struct tuple_element, 3>; + +template +struct tuple_element, 4>; + +template +struct tuple_element, 5>; + +template +struct tuple_element, 6>; + +template +struct tuple_element, 7>; + +template +struct tuple_element, 8>; + +template +struct tuple_element, 9>; + + + +template +struct tuple_element, 0>; + +template +struct tuple_element, 1>; + +template +struct tuple_element, 2>; + +template +struct tuple_element, 3>; + +template +struct tuple_element, 4>; + +template +struct tuple_element, 5>; + +template +struct tuple_element, 6>; + +template +struct tuple_element, 7>; + +template +struct tuple_element, 8>; + +template +struct tuple_element, 9>; + +template +struct tuple_element, 10>; + + + +template +struct tuple_element, 0>; + +template +struct tuple_element, 1>; + +template +struct tuple_element, 2>; + +template +struct tuple_element, 3>; + +template +struct tuple_element, 4>; + +template +struct tuple_element, 5>; + +template +struct tuple_element, 6>; + +template +struct tuple_element, 7>; + +template +struct tuple_element, 8>; + +template +struct tuple_element, 9>; + +template +struct tuple_element, 10>; + +template +struct tuple_element, 11>; + + + +template +struct tuple_element, 0>; + +template +struct tuple_element, 1>; + +template +struct tuple_element, 2>; + +template +struct tuple_element, 3>; + +template +struct tuple_element, 4>; + +template +struct tuple_element, 5>; + +template +struct tuple_element, 6>; + +template +struct tuple_element, 7>; + +template +struct tuple_element, 8>; + +template +struct tuple_element, 9>; + +template +struct tuple_element, 10>; + +template +struct tuple_element, 11>; + +template +struct tuple_element, 12>; + + + +template +struct tuple_element, 0>; + +template +struct tuple_element, 1>; + +template +struct tuple_element, 2>; + +template +struct tuple_element, 3>; + +template +struct tuple_element, 4>; + +template +struct tuple_element, 5>; + +template +struct tuple_element, 6>; + +template +struct tuple_element, 7>; + +template +struct tuple_element, 8>; + +template +struct tuple_element, 9>; + +template +struct tuple_element, 10>; + +template +struct tuple_element, 11>; + +template +struct tuple_element, 12>; + +template +struct tuple_element, 13>; + + + +template +struct tuple_element, 0>; + +template +struct tuple_element, 1>; + +template +struct tuple_element, 2>; + +template +struct tuple_element, 3>; + +template +struct tuple_element, 4>; + +template +struct tuple_element, 5>; + +template +struct tuple_element, 6>; + +template +struct tuple_element, 7>; + +template +struct tuple_element, 8>; + +template +struct tuple_element, 9>; + +template +struct tuple_element, 10>; + +template +struct tuple_element, 11>; + +template +struct tuple_element, 12>; + +template +struct tuple_element, 13>; + +template +struct tuple_element, 14>; + + + +template +struct tuple_element, 0>; + +template +struct tuple_element, 1>; + +template +struct tuple_element, 2>; + +template +struct tuple_element, 3>; + +template +struct tuple_element, 4>; + +template +struct tuple_element, 5>; + +template +struct tuple_element, 6>; + +template +struct tuple_element, 7>; + +template +struct tuple_element, 8>; + +template +struct tuple_element, 9>; + +template +struct tuple_element, 10>; + +template +struct tuple_element, 11>; + +template +struct tuple_element, 12>; + +template +struct tuple_element, 13>; + +template +struct tuple_element, 14>; + +template +struct tuple_element, 15>; + + + +template +struct tuple_element, 0>; + +template +struct tuple_element, 1>; + +template +struct tuple_element, 2>; + +template +struct tuple_element, 3>; + +template +struct tuple_element, 4>; + +template +struct tuple_element, 5>; + +template +struct tuple_element, 6>; + +template +struct tuple_element, 7>; + +template +struct tuple_element, 8>; + +template +struct tuple_element, 9>; + +template +struct tuple_element, 10>; + +template +struct tuple_element, 11>; + +template +struct tuple_element, 12>; + +template +struct tuple_element, 13>; + +template +struct tuple_element, 14>; + +template +struct tuple_element, 15>; + +template +struct tuple_element, 16>; + + + +template +struct tuple_element, 0>; + +template +struct tuple_element, 1>; + +template +struct tuple_element, 2>; + +template +struct tuple_element, 3>; + +template +struct tuple_element, 4>; + +template +struct tuple_element, 5>; + +template +struct tuple_element, 6>; + +template +struct tuple_element, 7>; + +template +struct tuple_element, 8>; + +template +struct tuple_element, 9>; + +template +struct tuple_element, 10>; + +template +struct tuple_element, 11>; + +template +struct tuple_element, 12>; + +template +struct tuple_element, 13>; + +template +struct tuple_element, 14>; + +template +struct tuple_element, 15>; + +template +struct tuple_element, 16>; + +template +struct tuple_element, 17>; + + + +template +struct tuple_element, 0>; + +template +struct tuple_element, 1>; + +template +struct tuple_element, 2>; + +template +struct tuple_element, 3>; + +template +struct tuple_element, 4>; + +template +struct tuple_element, 5>; + +template +struct tuple_element, 6>; + +template +struct tuple_element, 7>; + +template +struct tuple_element, 8>; + +template +struct tuple_element, 9>; + +template +struct tuple_element, 10>; + +template +struct tuple_element, 11>; + +template +struct tuple_element, 12>; + +template +struct tuple_element, 13>; + +template +struct tuple_element, 14>; + +template +struct tuple_element, 15>; + +template +struct tuple_element, 16>; + +template +struct tuple_element, 17>; + +template +struct tuple_element, 18>; + + + +template +struct tuple_element, 0>; + +template +struct tuple_element, 1>; + +template +struct tuple_element, 2>; + +template +struct tuple_element, 3>; + +template +struct tuple_element, 4>; + +template +struct tuple_element, 5>; + +template +struct tuple_element, 6>; + +template +struct tuple_element, 7>; + +template +struct tuple_element, 8>; + +template +struct tuple_element, 9>; + +template +struct tuple_element, 10>; + +template +struct tuple_element, 11>; + +template +struct tuple_element, 12>; + +template +struct tuple_element, 13>; + +template +struct tuple_element, 14>; + +template +struct tuple_element, 15>; + +template +struct tuple_element, 16>; + +template +struct tuple_element, 17>; + +template +struct tuple_element, 18>; + +template +struct tuple_element, 19>; + + + +template +struct tuple_element, 0>; + +template +struct tuple_element, 1>; + +template +struct tuple_element, 2>; + +template +struct tuple_element, 3>; + +template +struct tuple_element, 4>; + +template +struct tuple_element, 5>; + +template +struct tuple_element, 6>; + +template +struct tuple_element, 7>; + +template +struct tuple_element, 8>; + +template +struct tuple_element, 9>; + +template +struct tuple_element, 10>; + +template +struct tuple_element, 11>; + +template +struct tuple_element, 12>; + +template +struct tuple_element, 13>; + +template +struct tuple_element, 14>; + +template +struct tuple_element, 15>; + +template +struct tuple_element, 16>; + +template +struct tuple_element, 17>; + +template +struct tuple_element, 18>; + +template +struct tuple_element, 19>; + +template +struct tuple_element, 20>; + + + +template +struct tuple_element, 0>; + +template +struct tuple_element, 1>; + +template +struct tuple_element, 2>; + +template +struct tuple_element, 3>; + +template +struct tuple_element, 4>; + +template +struct tuple_element, 5>; + +template +struct tuple_element, 6>; + +template +struct tuple_element, 7>; + +template +struct tuple_element, 8>; + +template +struct tuple_element, 9>; + +template +struct tuple_element, 10>; + +template +struct tuple_element, 11>; + +template +struct tuple_element, 12>; + +template +struct tuple_element, 13>; + +template +struct tuple_element, 14>; + +template +struct tuple_element, 15>; + +template +struct tuple_element, 16>; + +template +struct tuple_element, 17>; + +template +struct tuple_element, 18>; + +template +struct tuple_element, 19>; + +template +struct tuple_element, 20>; + +template +struct tuple_element, 21>; + + + +template +struct tuple_element, 0>; + +template +struct tuple_element, 1>; + +template +struct tuple_element, 2>; + +template +struct tuple_element, 3>; + +template +struct tuple_element, 4>; + +template +struct tuple_element, 5>; + +template +struct tuple_element, 6>; + +template +struct tuple_element, 7>; + +template +struct tuple_element, 8>; + +template +struct tuple_element, 9>; + +template +struct tuple_element, 10>; + +template +struct tuple_element, 11>; + +template +struct tuple_element, 12>; + +template +struct tuple_element, 13>; + +template +struct tuple_element, 14>; + +template +struct tuple_element, 15>; + +template +struct tuple_element, 16>; + +template +struct tuple_element, 17>; + +template +struct tuple_element, 18>; + +template +struct tuple_element, 19>; + +template +struct tuple_element, 20>; + +template +struct tuple_element, 21>; + +template +struct tuple_element, 22>; + + + +template +struct tuple_element, 0>; + +template +struct tuple_element, 1>; + +template +struct tuple_element, 2>; + +template +struct tuple_element, 3>; + +template +struct tuple_element, 4>; + +template +struct tuple_element, 5>; + +template +struct tuple_element, 6>; + +template +struct tuple_element, 7>; + +template +struct tuple_element, 8>; + +template +struct tuple_element, 9>; + +template +struct tuple_element, 10>; + +template +struct tuple_element, 11>; + +template +struct tuple_element, 12>; + +template +struct tuple_element, 13>; + +template +struct tuple_element, 14>; + +template +struct tuple_element, 15>; + +template +struct tuple_element, 16>; + +template +struct tuple_element, 17>; + +template +struct tuple_element, 18>; + +template +struct tuple_element, 19>; + +template +struct tuple_element, 20>; + +template +struct tuple_element, 21>; + +template +struct tuple_element, 22>; + +template +struct tuple_element, 23>; + + + +template +struct tuple_element, 0>; + +template +struct tuple_element, 1>; + +template +struct tuple_element, 2>; + +template +struct tuple_element, 3>; + +template +struct tuple_element, 4>; + +template +struct tuple_element, 5>; + +template +struct tuple_element, 6>; + +template +struct tuple_element, 7>; + +template +struct tuple_element, 8>; + +template +struct tuple_element, 9>; + +template +struct tuple_element, 10>; + +template +struct tuple_element, 11>; + +template +struct tuple_element, 12>; + +template +struct tuple_element, 13>; + +template +struct tuple_element, 14>; + +template +struct tuple_element, 15>; + +template +struct tuple_element, 16>; + +template +struct tuple_element, 17>; + +template +struct tuple_element, 18>; + +template +struct tuple_element, 19>; + +template +struct tuple_element, 20>; + +template +struct tuple_element, 21>; + +template +struct tuple_element, 22>; + +template +struct tuple_element, 23>; + +template +struct tuple_element, 24>; + + + +template +struct tuple_element, 0>; + +template +struct tuple_element, 1>; + +template +struct tuple_element, 2>; + +template +struct tuple_element, 3>; + +template +struct tuple_element, 4>; + +template +struct tuple_element, 5>; + +template +struct tuple_element, 6>; + +template +struct tuple_element, 7>; + +template +struct tuple_element, 8>; + +template +struct tuple_element, 9>; + +template +struct tuple_element, 10>; + +template +struct tuple_element, 11>; + +template +struct tuple_element, 12>; + +template +struct tuple_element, 13>; + +template +struct tuple_element, 14>; + +template +struct tuple_element, 15>; + +template +struct tuple_element, 16>; + +template +struct tuple_element, 17>; + +template +struct tuple_element, 18>; + +template +struct tuple_element, 19>; + +template +struct tuple_element, 20>; + +template +struct tuple_element, 21>; + +template +struct tuple_element, 22>; + +template +struct tuple_element, 23>; + +template +struct tuple_element, 24>; + +template +struct tuple_element, 25>; + + + +template +struct tuple_element, 0>; + +template +struct tuple_element, 1>; + +template +struct tuple_element, 2>; + +template +struct tuple_element, 3>; + +template +struct tuple_element, 4>; + +template +struct tuple_element, 5>; + +template +struct tuple_element, 6>; + +template +struct tuple_element, 7>; + +template +struct tuple_element, 8>; + +template +struct tuple_element, 9>; + +template +struct tuple_element, 10>; + +template +struct tuple_element, 11>; + +template +struct tuple_element, 12>; + +template +struct tuple_element, 13>; + +template +struct tuple_element, 14>; + +template +struct tuple_element, 15>; + +template +struct tuple_element, 16>; + +template +struct tuple_element, 17>; + +template +struct tuple_element, 18>; + +template +struct tuple_element, 19>; + +template +struct tuple_element, 20>; + +template +struct tuple_element, 21>; + +template +struct tuple_element, 22>; + +template +struct tuple_element, 23>; + +template +struct tuple_element, 24>; + +template +struct tuple_element, 25>; + +template +struct tuple_element, 26>; + + + +template +struct tuple_element, 0>; + +template +struct tuple_element, 1>; + +template +struct tuple_element, 2>; + +template +struct tuple_element, 3>; + +template +struct tuple_element, 4>; + +template +struct tuple_element, 5>; + +template +struct tuple_element, 6>; + +template +struct tuple_element, 7>; + +template +struct tuple_element, 8>; + +template +struct tuple_element, 9>; + +template +struct tuple_element, 10>; + +template +struct tuple_element, 11>; + +template +struct tuple_element, 12>; + +template +struct tuple_element, 13>; + +template +struct tuple_element, 14>; + +template +struct tuple_element, 15>; + +template +struct tuple_element, 16>; + +template +struct tuple_element, 17>; + +template +struct tuple_element, 18>; + +template +struct tuple_element, 19>; + +template +struct tuple_element, 20>; + +template +struct tuple_element, 21>; + +template +struct tuple_element, 22>; + +template +struct tuple_element, 23>; + +template +struct tuple_element, 24>; + +template +struct tuple_element, 25>; + +template +struct tuple_element, 26>; + +template +struct tuple_element, 27>; + + + +template +struct tuple_element, 0>; + +template +struct tuple_element, 1>; + +template +struct tuple_element, 2>; + +template +struct tuple_element, 3>; + +template +struct tuple_element, 4>; + +template +struct tuple_element, 5>; + +template +struct tuple_element, 6>; + +template +struct tuple_element, 7>; + +template +struct tuple_element, 8>; + +template +struct tuple_element, 9>; + +template +struct tuple_element, 10>; + +template +struct tuple_element, 11>; + +template +struct tuple_element, 12>; + +template +struct tuple_element, 13>; + +template +struct tuple_element, 14>; + +template +struct tuple_element, 15>; + +template +struct tuple_element, 16>; + +template +struct tuple_element, 17>; + +template +struct tuple_element, 18>; + +template +struct tuple_element, 19>; + +template +struct tuple_element, 20>; + +template +struct tuple_element, 21>; + +template +struct tuple_element, 22>; + +template +struct tuple_element, 23>; + +template +struct tuple_element, 24>; + +template +struct tuple_element, 25>; + +template +struct tuple_element, 26>; + +template +struct tuple_element, 27>; + +template +struct tuple_element, 28>; + + + +template +struct tuple_element, 0>; + +template +struct tuple_element, 1>; + +template +struct tuple_element, 2>; + +template +struct tuple_element, 3>; + +template +struct tuple_element, 4>; + +template +struct tuple_element, 5>; + +template +struct tuple_element, 6>; + +template +struct tuple_element, 7>; + +template +struct tuple_element, 8>; + +template +struct tuple_element, 9>; + +template +struct tuple_element, 10>; + +template +struct tuple_element, 11>; + +template +struct tuple_element, 12>; + +template +struct tuple_element, 13>; + +template +struct tuple_element, 14>; + +template +struct tuple_element, 15>; + +template +struct tuple_element, 16>; + +template +struct tuple_element, 17>; + +template +struct tuple_element, 18>; + +template +struct tuple_element, 19>; + +template +struct tuple_element, 20>; + +template +struct tuple_element, 21>; + +template +struct tuple_element, 22>; + +template +struct tuple_element, 23>; + +template +struct tuple_element, 24>; + +template +struct tuple_element, 25>; + +template +struct tuple_element, 26>; + +template +struct tuple_element, 27>; + +template +struct tuple_element, 28>; + +template +struct tuple_element, 29>; + + + +template +struct tuple_element, 0>; + +template +struct tuple_element, 1>; + +template +struct tuple_element, 2>; + +template +struct tuple_element, 3>; + +template +struct tuple_element, 4>; + +template +struct tuple_element, 5>; + +template +struct tuple_element, 6>; + +template +struct tuple_element, 7>; + +template +struct tuple_element, 8>; + +template +struct tuple_element, 9>; + +template +struct tuple_element, 10>; + +template +struct tuple_element, 11>; + +template +struct tuple_element, 12>; + +template +struct tuple_element, 13>; + +template +struct tuple_element, 14>; + +template +struct tuple_element, 15>; + +template +struct tuple_element, 16>; + +template +struct tuple_element, 17>; + +template +struct tuple_element, 18>; + +template +struct tuple_element, 19>; + +template +struct tuple_element, 20>; + +template +struct tuple_element, 21>; + +template +struct tuple_element, 22>; + +template +struct tuple_element, 23>; + +template +struct tuple_element, 24>; + +template +struct tuple_element, 25>; + +template +struct tuple_element, 26>; + +template +struct tuple_element, 27>; + +template +struct tuple_element, 28>; + +template +struct tuple_element, 29>; + +template +struct tuple_element, 30>; + + + +template +struct tuple_element, 0>; + +template +struct tuple_element, 1>; + +template +struct tuple_element, 2>; + +template +struct tuple_element, 3>; + +template +struct tuple_element, 4>; + +template +struct tuple_element, 5>; + +template +struct tuple_element, 6>; + +template +struct tuple_element, 7>; + +template +struct tuple_element, 8>; + +template +struct tuple_element, 9>; + +template +struct tuple_element, 10>; + +template +struct tuple_element, 11>; + +template +struct tuple_element, 12>; + +template +struct tuple_element, 13>; + +template +struct tuple_element, 14>; + +template +struct tuple_element, 15>; + +template +struct tuple_element, 16>; + +template +struct tuple_element, 17>; + +template +struct tuple_element, 18>; + +template +struct tuple_element, 19>; + +template +struct tuple_element, 20>; + +template +struct tuple_element, 21>; + +template +struct tuple_element, 22>; + +template +struct tuple_element, 23>; + +template +struct tuple_element, 24>; + +template +struct tuple_element, 25>; + +template +struct tuple_element, 26>; + +template +struct tuple_element, 27>; + +template +struct tuple_element, 28>; + +template +struct tuple_element, 29>; + +template +struct tuple_element, 30>; + +template +struct tuple_element, 31>; + + + + + +template +struct const_tuple_element, 0>; + + + +template +struct const_tuple_element, 0>; + +template +struct const_tuple_element, 1>; + + + +template +struct const_tuple_element, 0>; + +template +struct const_tuple_element, 1>; + +template +struct const_tuple_element, 2>; + + + +template +struct const_tuple_element, 0>; + +template +struct const_tuple_element, 1>; + +template +struct const_tuple_element, 2>; + +template +struct const_tuple_element, 3>; + + + +template +struct const_tuple_element, 0>; + +template +struct const_tuple_element, 1>; + +template +struct const_tuple_element, 2>; + +template +struct const_tuple_element, 3>; + +template +struct const_tuple_element, 4>; + + + +template +struct const_tuple_element, 0>; + +template +struct const_tuple_element, 1>; + +template +struct const_tuple_element, 2>; + +template +struct const_tuple_element, 3>; + +template +struct const_tuple_element, 4>; + +template +struct const_tuple_element, 5>; + + + +template +struct const_tuple_element, 0>; + +template +struct const_tuple_element, 1>; + +template +struct const_tuple_element, 2>; + +template +struct const_tuple_element, 3>; + +template +struct const_tuple_element, 4>; + +template +struct const_tuple_element, 5>; + +template +struct const_tuple_element, 6>; + + + +template +struct const_tuple_element, 0>; + +template +struct const_tuple_element, 1>; + +template +struct const_tuple_element, 2>; + +template +struct const_tuple_element, 3>; + +template +struct const_tuple_element, 4>; + +template +struct const_tuple_element, 5>; + +template +struct const_tuple_element, 6>; + +template +struct const_tuple_element, 7>; + + + +template +struct const_tuple_element, 0>; + +template +struct const_tuple_element, 1>; + +template +struct const_tuple_element, 2>; + +template +struct const_tuple_element, 3>; + +template +struct const_tuple_element, 4>; + +template +struct const_tuple_element, 5>; + +template +struct const_tuple_element, 6>; + +template +struct const_tuple_element, 7>; + +template +struct const_tuple_element, 8>; + + + +template +struct const_tuple_element, 0>; + +template +struct const_tuple_element, 1>; + +template +struct const_tuple_element, 2>; + +template +struct const_tuple_element, 3>; + +template +struct const_tuple_element, 4>; + +template +struct const_tuple_element, 5>; + +template +struct const_tuple_element, 6>; + +template +struct const_tuple_element, 7>; + +template +struct const_tuple_element, 8>; + +template +struct const_tuple_element, 9>; + + + +template +struct const_tuple_element, 0>; + +template +struct const_tuple_element, 1>; + +template +struct const_tuple_element, 2>; + +template +struct const_tuple_element, 3>; + +template +struct const_tuple_element, 4>; + +template +struct const_tuple_element, 5>; + +template +struct const_tuple_element, 6>; + +template +struct const_tuple_element, 7>; + +template +struct const_tuple_element, 8>; + +template +struct const_tuple_element, 9>; + +template +struct const_tuple_element, 10>; + + + +template +struct const_tuple_element, 0>; + +template +struct const_tuple_element, 1>; + +template +struct const_tuple_element, 2>; + +template +struct const_tuple_element, 3>; + +template +struct const_tuple_element, 4>; + +template +struct const_tuple_element, 5>; + +template +struct const_tuple_element, 6>; + +template +struct const_tuple_element, 7>; + +template +struct const_tuple_element, 8>; + +template +struct const_tuple_element, 9>; + +template +struct const_tuple_element, 10>; + +template +struct const_tuple_element, 11>; + + + +template +struct const_tuple_element, 0>; + +template +struct const_tuple_element, 1>; + +template +struct const_tuple_element, 2>; + +template +struct const_tuple_element, 3>; + +template +struct const_tuple_element, 4>; + +template +struct const_tuple_element, 5>; + +template +struct const_tuple_element, 6>; + +template +struct const_tuple_element, 7>; + +template +struct const_tuple_element, 8>; + +template +struct const_tuple_element, 9>; + +template +struct const_tuple_element, 10>; + +template +struct const_tuple_element, 11>; + +template +struct const_tuple_element, 12>; + + + +template +struct const_tuple_element, 0>; + +template +struct const_tuple_element, 1>; + +template +struct const_tuple_element, 2>; + +template +struct const_tuple_element, 3>; + +template +struct const_tuple_element, 4>; + +template +struct const_tuple_element, 5>; + +template +struct const_tuple_element, 6>; + +template +struct const_tuple_element, 7>; + +template +struct const_tuple_element, 8>; + +template +struct const_tuple_element, 9>; + +template +struct const_tuple_element, 10>; + +template +struct const_tuple_element, 11>; + +template +struct const_tuple_element, 12>; + +template +struct const_tuple_element, 13>; + + + +template +struct const_tuple_element, 0>; + +template +struct const_tuple_element, 1>; + +template +struct const_tuple_element, 2>; + +template +struct const_tuple_element, 3>; + +template +struct const_tuple_element, 4>; + +template +struct const_tuple_element, 5>; + +template +struct const_tuple_element, 6>; + +template +struct const_tuple_element, 7>; + +template +struct const_tuple_element, 8>; + +template +struct const_tuple_element, 9>; + +template +struct const_tuple_element, 10>; + +template +struct const_tuple_element, 11>; + +template +struct const_tuple_element, 12>; + +template +struct const_tuple_element, 13>; + +template +struct const_tuple_element, 14>; + + + +template +struct const_tuple_element, 0>; + +template +struct const_tuple_element, 1>; + +template +struct const_tuple_element, 2>; + +template +struct const_tuple_element, 3>; + +template +struct const_tuple_element, 4>; + +template +struct const_tuple_element, 5>; + +template +struct const_tuple_element, 6>; + +template +struct const_tuple_element, 7>; + +template +struct const_tuple_element, 8>; + +template +struct const_tuple_element, 9>; + +template +struct const_tuple_element, 10>; + +template +struct const_tuple_element, 11>; + +template +struct const_tuple_element, 12>; + +template +struct const_tuple_element, 13>; + +template +struct const_tuple_element, 14>; + +template +struct const_tuple_element, 15>; + + + +template +struct const_tuple_element, 0>; + +template +struct const_tuple_element, 1>; + +template +struct const_tuple_element, 2>; + +template +struct const_tuple_element, 3>; + +template +struct const_tuple_element, 4>; + +template +struct const_tuple_element, 5>; + +template +struct const_tuple_element, 6>; + +template +struct const_tuple_element, 7>; + +template +struct const_tuple_element, 8>; + +template +struct const_tuple_element, 9>; + +template +struct const_tuple_element, 10>; + +template +struct const_tuple_element, 11>; + +template +struct const_tuple_element, 12>; + +template +struct const_tuple_element, 13>; + +template +struct const_tuple_element, 14>; + +template +struct const_tuple_element, 15>; + +template +struct const_tuple_element, 16>; + + + +template +struct const_tuple_element, 0>; + +template +struct const_tuple_element, 1>; + +template +struct const_tuple_element, 2>; + +template +struct const_tuple_element, 3>; + +template +struct const_tuple_element, 4>; + +template +struct const_tuple_element, 5>; + +template +struct const_tuple_element, 6>; + +template +struct const_tuple_element, 7>; + +template +struct const_tuple_element, 8>; + +template +struct const_tuple_element, 9>; + +template +struct const_tuple_element, 10>; + +template +struct const_tuple_element, 11>; + +template +struct const_tuple_element, 12>; + +template +struct const_tuple_element, 13>; + +template +struct const_tuple_element, 14>; + +template +struct const_tuple_element, 15>; + +template +struct const_tuple_element, 16>; + +template +struct const_tuple_element, 17>; + + + +template +struct const_tuple_element, 0>; + +template +struct const_tuple_element, 1>; + +template +struct const_tuple_element, 2>; + +template +struct const_tuple_element, 3>; + +template +struct const_tuple_element, 4>; + +template +struct const_tuple_element, 5>; + +template +struct const_tuple_element, 6>; + +template +struct const_tuple_element, 7>; + +template +struct const_tuple_element, 8>; + +template +struct const_tuple_element, 9>; + +template +struct const_tuple_element, 10>; + +template +struct const_tuple_element, 11>; + +template +struct const_tuple_element, 12>; + +template +struct const_tuple_element, 13>; + +template +struct const_tuple_element, 14>; + +template +struct const_tuple_element, 15>; + +template +struct const_tuple_element, 16>; + +template +struct const_tuple_element, 17>; + +template +struct const_tuple_element, 18>; + + + +template +struct const_tuple_element, 0>; + +template +struct const_tuple_element, 1>; + +template +struct const_tuple_element, 2>; + +template +struct const_tuple_element, 3>; + +template +struct const_tuple_element, 4>; + +template +struct const_tuple_element, 5>; + +template +struct const_tuple_element, 6>; + +template +struct const_tuple_element, 7>; + +template +struct const_tuple_element, 8>; + +template +struct const_tuple_element, 9>; + +template +struct const_tuple_element, 10>; + +template +struct const_tuple_element, 11>; + +template +struct const_tuple_element, 12>; + +template +struct const_tuple_element, 13>; + +template +struct const_tuple_element, 14>; + +template +struct const_tuple_element, 15>; + +template +struct const_tuple_element, 16>; + +template +struct const_tuple_element, 17>; + +template +struct const_tuple_element, 18>; + +template +struct const_tuple_element, 19>; + + + +template +struct const_tuple_element, 0>; + +template +struct const_tuple_element, 1>; + +template +struct const_tuple_element, 2>; + +template +struct const_tuple_element, 3>; + +template +struct const_tuple_element, 4>; + +template +struct const_tuple_element, 5>; + +template +struct const_tuple_element, 6>; + +template +struct const_tuple_element, 7>; + +template +struct const_tuple_element, 8>; + +template +struct const_tuple_element, 9>; + +template +struct const_tuple_element, 10>; + +template +struct const_tuple_element, 11>; + +template +struct const_tuple_element, 12>; + +template +struct const_tuple_element, 13>; + +template +struct const_tuple_element, 14>; + +template +struct const_tuple_element, 15>; + +template +struct const_tuple_element, 16>; + +template +struct const_tuple_element, 17>; + +template +struct const_tuple_element, 18>; + +template +struct const_tuple_element, 19>; + +template +struct const_tuple_element, 20>; + + + +template +struct const_tuple_element, 0>; + +template +struct const_tuple_element, 1>; + +template +struct const_tuple_element, 2>; + +template +struct const_tuple_element, 3>; + +template +struct const_tuple_element, 4>; + +template +struct const_tuple_element, 5>; + +template +struct const_tuple_element, 6>; + +template +struct const_tuple_element, 7>; + +template +struct const_tuple_element, 8>; + +template +struct const_tuple_element, 9>; + +template +struct const_tuple_element, 10>; + +template +struct const_tuple_element, 11>; + +template +struct const_tuple_element, 12>; + +template +struct const_tuple_element, 13>; + +template +struct const_tuple_element, 14>; + +template +struct const_tuple_element, 15>; + +template +struct const_tuple_element, 16>; + +template +struct const_tuple_element, 17>; + +template +struct const_tuple_element, 18>; + +template +struct const_tuple_element, 19>; + +template +struct const_tuple_element, 20>; + +template +struct const_tuple_element, 21>; + + + +template +struct const_tuple_element, 0>; + +template +struct const_tuple_element, 1>; + +template +struct const_tuple_element, 2>; + +template +struct const_tuple_element, 3>; + +template +struct const_tuple_element, 4>; + +template +struct const_tuple_element, 5>; + +template +struct const_tuple_element, 6>; + +template +struct const_tuple_element, 7>; + +template +struct const_tuple_element, 8>; + +template +struct const_tuple_element, 9>; + +template +struct const_tuple_element, 10>; + +template +struct const_tuple_element, 11>; + +template +struct const_tuple_element, 12>; + +template +struct const_tuple_element, 13>; + +template +struct const_tuple_element, 14>; + +template +struct const_tuple_element, 15>; + +template +struct const_tuple_element, 16>; + +template +struct const_tuple_element, 17>; + +template +struct const_tuple_element, 18>; + +template +struct const_tuple_element, 19>; + +template +struct const_tuple_element, 20>; + +template +struct const_tuple_element, 21>; + +template +struct const_tuple_element, 22>; + + + +template +struct const_tuple_element, 0>; + +template +struct const_tuple_element, 1>; + +template +struct const_tuple_element, 2>; + +template +struct const_tuple_element, 3>; + +template +struct const_tuple_element, 4>; + +template +struct const_tuple_element, 5>; + +template +struct const_tuple_element, 6>; + +template +struct const_tuple_element, 7>; + +template +struct const_tuple_element, 8>; + +template +struct const_tuple_element, 9>; + +template +struct const_tuple_element, 10>; + +template +struct const_tuple_element, 11>; + +template +struct const_tuple_element, 12>; + +template +struct const_tuple_element, 13>; + +template +struct const_tuple_element, 14>; + +template +struct const_tuple_element, 15>; + +template +struct const_tuple_element, 16>; + +template +struct const_tuple_element, 17>; + +template +struct const_tuple_element, 18>; + +template +struct const_tuple_element, 19>; + +template +struct const_tuple_element, 20>; + +template +struct const_tuple_element, 21>; + +template +struct const_tuple_element, 22>; + +template +struct const_tuple_element, 23>; + + + +template +struct const_tuple_element, 0>; + +template +struct const_tuple_element, 1>; + +template +struct const_tuple_element, 2>; + +template +struct const_tuple_element, 3>; + +template +struct const_tuple_element, 4>; + +template +struct const_tuple_element, 5>; + +template +struct const_tuple_element, 6>; + +template +struct const_tuple_element, 7>; + +template +struct const_tuple_element, 8>; + +template +struct const_tuple_element, 9>; + +template +struct const_tuple_element, 10>; + +template +struct const_tuple_element, 11>; + +template +struct const_tuple_element, 12>; + +template +struct const_tuple_element, 13>; + +template +struct const_tuple_element, 14>; + +template +struct const_tuple_element, 15>; + +template +struct const_tuple_element, 16>; + +template +struct const_tuple_element, 17>; + +template +struct const_tuple_element, 18>; + +template +struct const_tuple_element, 19>; + +template +struct const_tuple_element, 20>; + +template +struct const_tuple_element, 21>; + +template +struct const_tuple_element, 22>; + +template +struct const_tuple_element, 23>; + +template +struct const_tuple_element, 24>; + + + +template +struct const_tuple_element, 0>; + +template +struct const_tuple_element, 1>; + +template +struct const_tuple_element, 2>; + +template +struct const_tuple_element, 3>; + +template +struct const_tuple_element, 4>; + +template +struct const_tuple_element, 5>; + +template +struct const_tuple_element, 6>; + +template +struct const_tuple_element, 7>; + +template +struct const_tuple_element, 8>; + +template +struct const_tuple_element, 9>; + +template +struct const_tuple_element, 10>; + +template +struct const_tuple_element, 11>; + +template +struct const_tuple_element, 12>; + +template +struct const_tuple_element, 13>; + +template +struct const_tuple_element, 14>; + +template +struct const_tuple_element, 15>; + +template +struct const_tuple_element, 16>; + +template +struct const_tuple_element, 17>; + +template +struct const_tuple_element, 18>; + +template +struct const_tuple_element, 19>; + +template +struct const_tuple_element, 20>; + +template +struct const_tuple_element, 21>; + +template +struct const_tuple_element, 22>; + +template +struct const_tuple_element, 23>; + +template +struct const_tuple_element, 24>; + +template +struct const_tuple_element, 25>; + + + +template +struct const_tuple_element, 0>; + +template +struct const_tuple_element, 1>; + +template +struct const_tuple_element, 2>; + +template +struct const_tuple_element, 3>; + +template +struct const_tuple_element, 4>; + +template +struct const_tuple_element, 5>; + +template +struct const_tuple_element, 6>; + +template +struct const_tuple_element, 7>; + +template +struct const_tuple_element, 8>; + +template +struct const_tuple_element, 9>; + +template +struct const_tuple_element, 10>; + +template +struct const_tuple_element, 11>; + +template +struct const_tuple_element, 12>; + +template +struct const_tuple_element, 13>; + +template +struct const_tuple_element, 14>; + +template +struct const_tuple_element, 15>; + +template +struct const_tuple_element, 16>; + +template +struct const_tuple_element, 17>; + +template +struct const_tuple_element, 18>; + +template +struct const_tuple_element, 19>; + +template +struct const_tuple_element, 20>; + +template +struct const_tuple_element, 21>; + +template +struct const_tuple_element, 22>; + +template +struct const_tuple_element, 23>; + +template +struct const_tuple_element, 24>; + +template +struct const_tuple_element, 25>; + +template +struct const_tuple_element, 26>; + + + +template +struct const_tuple_element, 0>; + +template +struct const_tuple_element, 1>; + +template +struct const_tuple_element, 2>; + +template +struct const_tuple_element, 3>; + +template +struct const_tuple_element, 4>; + +template +struct const_tuple_element, 5>; + +template +struct const_tuple_element, 6>; + +template +struct const_tuple_element, 7>; + +template +struct const_tuple_element, 8>; + +template +struct const_tuple_element, 9>; + +template +struct const_tuple_element, 10>; + +template +struct const_tuple_element, 11>; + +template +struct const_tuple_element, 12>; + +template +struct const_tuple_element, 13>; + +template +struct const_tuple_element, 14>; + +template +struct const_tuple_element, 15>; + +template +struct const_tuple_element, 16>; + +template +struct const_tuple_element, 17>; + +template +struct const_tuple_element, 18>; + +template +struct const_tuple_element, 19>; + +template +struct const_tuple_element, 20>; + +template +struct const_tuple_element, 21>; + +template +struct const_tuple_element, 22>; + +template +struct const_tuple_element, 23>; + +template +struct const_tuple_element, 24>; + +template +struct const_tuple_element, 25>; + +template +struct const_tuple_element, 26>; + +template +struct const_tuple_element, 27>; + + + +template +struct const_tuple_element, 0>; + +template +struct const_tuple_element, 1>; + +template +struct const_tuple_element, 2>; + +template +struct const_tuple_element, 3>; + +template +struct const_tuple_element, 4>; + +template +struct const_tuple_element, 5>; + +template +struct const_tuple_element, 6>; + +template +struct const_tuple_element, 7>; + +template +struct const_tuple_element, 8>; + +template +struct const_tuple_element, 9>; + +template +struct const_tuple_element, 10>; + +template +struct const_tuple_element, 11>; + +template +struct const_tuple_element, 12>; + +template +struct const_tuple_element, 13>; + +template +struct const_tuple_element, 14>; + +template +struct const_tuple_element, 15>; + +template +struct const_tuple_element, 16>; + +template +struct const_tuple_element, 17>; + +template +struct const_tuple_element, 18>; + +template +struct const_tuple_element, 19>; + +template +struct const_tuple_element, 20>; + +template +struct const_tuple_element, 21>; + +template +struct const_tuple_element, 22>; + +template +struct const_tuple_element, 23>; + +template +struct const_tuple_element, 24>; + +template +struct const_tuple_element, 25>; + +template +struct const_tuple_element, 26>; + +template +struct const_tuple_element, 27>; + +template +struct const_tuple_element, 28>; + + + +template +struct const_tuple_element, 0>; + +template +struct const_tuple_element, 1>; + +template +struct const_tuple_element, 2>; + +template +struct const_tuple_element, 3>; + +template +struct const_tuple_element, 4>; + +template +struct const_tuple_element, 5>; + +template +struct const_tuple_element, 6>; + +template +struct const_tuple_element, 7>; + +template +struct const_tuple_element, 8>; + +template +struct const_tuple_element, 9>; + +template +struct const_tuple_element, 10>; + +template +struct const_tuple_element, 11>; + +template +struct const_tuple_element, 12>; + +template +struct const_tuple_element, 13>; + +template +struct const_tuple_element, 14>; + +template +struct const_tuple_element, 15>; + +template +struct const_tuple_element, 16>; + +template +struct const_tuple_element, 17>; + +template +struct const_tuple_element, 18>; + +template +struct const_tuple_element, 19>; + +template +struct const_tuple_element, 20>; + +template +struct const_tuple_element, 21>; + +template +struct const_tuple_element, 22>; + +template +struct const_tuple_element, 23>; + +template +struct const_tuple_element, 24>; + +template +struct const_tuple_element, 25>; + +template +struct const_tuple_element, 26>; + +template +struct const_tuple_element, 27>; + +template +struct const_tuple_element, 28>; + +template +struct const_tuple_element, 29>; + + + +template +struct const_tuple_element, 0>; + +template +struct const_tuple_element, 1>; + +template +struct const_tuple_element, 2>; + +template +struct const_tuple_element, 3>; + +template +struct const_tuple_element, 4>; + +template +struct const_tuple_element, 5>; + +template +struct const_tuple_element, 6>; + +template +struct const_tuple_element, 7>; + +template +struct const_tuple_element, 8>; + +template +struct const_tuple_element, 9>; + +template +struct const_tuple_element, 10>; + +template +struct const_tuple_element, 11>; + +template +struct const_tuple_element, 12>; + +template +struct const_tuple_element, 13>; + +template +struct const_tuple_element, 14>; + +template +struct const_tuple_element, 15>; + +template +struct const_tuple_element, 16>; + +template +struct const_tuple_element, 17>; + +template +struct const_tuple_element, 18>; + +template +struct const_tuple_element, 19>; + +template +struct const_tuple_element, 20>; + +template +struct const_tuple_element, 21>; + +template +struct const_tuple_element, 22>; + +template +struct const_tuple_element, 23>; + +template +struct const_tuple_element, 24>; + +template +struct const_tuple_element, 25>; + +template +struct const_tuple_element, 26>; + +template +struct const_tuple_element, 27>; + +template +struct const_tuple_element, 28>; + +template +struct const_tuple_element, 29>; + +template +struct const_tuple_element, 30>; + + + +template +struct const_tuple_element, 0>; + +template +struct const_tuple_element, 1>; + +template +struct const_tuple_element, 2>; + +template +struct const_tuple_element, 3>; + +template +struct const_tuple_element, 4>; + +template +struct const_tuple_element, 5>; + +template +struct const_tuple_element, 6>; + +template +struct const_tuple_element, 7>; + +template +struct const_tuple_element, 8>; + +template +struct const_tuple_element, 9>; + +template +struct const_tuple_element, 10>; + +template +struct const_tuple_element, 11>; + +template +struct const_tuple_element, 12>; + +template +struct const_tuple_element, 13>; + +template +struct const_tuple_element, 14>; + +template +struct const_tuple_element, 15>; + +template +struct const_tuple_element, 16>; + +template +struct const_tuple_element, 17>; + +template +struct const_tuple_element, 18>; + +template +struct const_tuple_element, 19>; + +template +struct const_tuple_element, 20>; + +template +struct const_tuple_element, 21>; + +template +struct const_tuple_element, 22>; + +template +struct const_tuple_element, 23>; + +template +struct const_tuple_element, 24>; + +template +struct const_tuple_element, 25>; + +template +struct const_tuple_element, 26>; + +template +struct const_tuple_element, 27>; + +template +struct const_tuple_element, 28>; + +template +struct const_tuple_element, 29>; + +template +struct const_tuple_element, 30>; + +template +struct const_tuple_element, 31>; + + + +template <> +struct tuple<>; + +template +struct tuple; + +template +typename type::tuple_element, N>::reference get(type::tuple& t); +template +typename type::const_tuple_element, N>::const_reference get(type::tuple const& t); + +template +struct tuple; + +template +typename type::tuple_element, N>::reference get(type::tuple& t); +template +typename type::const_tuple_element, N>::const_reference get(type::tuple const& t); + +template +struct tuple; + +template +typename type::tuple_element, N>::reference get(type::tuple& t); +template +typename type::const_tuple_element, N>::const_reference get(type::tuple const& t); + +template +struct tuple; + +template +typename type::tuple_element, N>::reference get(type::tuple& t); +template +typename type::const_tuple_element, N>::const_reference get(type::tuple const& t); + +template +struct tuple; + +template +typename type::tuple_element, N>::reference get(type::tuple& t); +template +typename type::const_tuple_element, N>::const_reference get(type::tuple const& t); + +template +struct tuple; + +template +typename type::tuple_element, N>::reference get(type::tuple& t); +template +typename type::const_tuple_element, N>::const_reference get(type::tuple const& t); + +template +struct tuple; + +template +typename type::tuple_element, N>::reference get(type::tuple& t); +template +typename type::const_tuple_element, N>::const_reference get(type::tuple const& t); + +template +struct tuple; + +template +typename type::tuple_element, N>::reference get(type::tuple& t); +template +typename type::const_tuple_element, N>::const_reference get(type::tuple const& t); + +template +struct tuple; + +template +typename type::tuple_element, N>::reference get(type::tuple& t); +template +typename type::const_tuple_element, N>::const_reference get(type::tuple const& t); + +template +struct tuple; + +template +typename type::tuple_element, N>::reference get(type::tuple& t); +template +typename type::const_tuple_element, N>::const_reference get(type::tuple const& t); + +template +struct tuple; + +template +typename type::tuple_element, N>::reference get(type::tuple& t); +template +typename type::const_tuple_element, N>::const_reference get(type::tuple const& t); + +template +struct tuple; + +template +typename type::tuple_element, N>::reference get(type::tuple& t); +template +typename type::const_tuple_element, N>::const_reference get(type::tuple const& t); + +template +struct tuple; + +template +typename type::tuple_element, N>::reference get(type::tuple& t); +template +typename type::const_tuple_element, N>::const_reference get(type::tuple const& t); + +template +struct tuple; + +template +typename type::tuple_element, N>::reference get(type::tuple& t); +template +typename type::const_tuple_element, N>::const_reference get(type::tuple const& t); + +template +struct tuple; + +template +typename type::tuple_element, N>::reference get(type::tuple& t); +template +typename type::const_tuple_element, N>::const_reference get(type::tuple const& t); + +template +struct tuple; + +template +typename type::tuple_element, N>::reference get(type::tuple& t); +template +typename type::const_tuple_element, N>::const_reference get(type::tuple const& t); + +template +struct tuple; + +template +typename type::tuple_element, N>::reference get(type::tuple& t); +template +typename type::const_tuple_element, N>::const_reference get(type::tuple const& t); + +template +struct tuple; + +template +typename type::tuple_element, N>::reference get(type::tuple& t); +template +typename type::const_tuple_element, N>::const_reference get(type::tuple const& t); + +template +struct tuple; + +template +typename type::tuple_element, N>::reference get(type::tuple& t); +template +typename type::const_tuple_element, N>::const_reference get(type::tuple const& t); + +template +struct tuple; + +template +typename type::tuple_element, N>::reference get(type::tuple& t); +template +typename type::const_tuple_element, N>::const_reference get(type::tuple const& t); + +template +struct tuple; + +template +typename type::tuple_element, N>::reference get(type::tuple& t); +template +typename type::const_tuple_element, N>::const_reference get(type::tuple const& t); + +template +struct tuple; + +template +typename type::tuple_element, N>::reference get(type::tuple& t); +template +typename type::const_tuple_element, N>::const_reference get(type::tuple const& t); + +template +struct tuple; + +template +typename type::tuple_element, N>::reference get(type::tuple& t); +template +typename type::const_tuple_element, N>::const_reference get(type::tuple const& t); + +template +struct tuple; + +template +typename type::tuple_element, N>::reference get(type::tuple& t); +template +typename type::const_tuple_element, N>::const_reference get(type::tuple const& t); + +template +struct tuple; + +template +typename type::tuple_element, N>::reference get(type::tuple& t); +template +typename type::const_tuple_element, N>::const_reference get(type::tuple const& t); + +template +struct tuple; + +template +typename type::tuple_element, N>::reference get(type::tuple& t); +template +typename type::const_tuple_element, N>::const_reference get(type::tuple const& t); + +template +struct tuple; + +template +typename type::tuple_element, N>::reference get(type::tuple& t); +template +typename type::const_tuple_element, N>::const_reference get(type::tuple const& t); + +template +struct tuple; + +template +typename type::tuple_element, N>::reference get(type::tuple& t); +template +typename type::const_tuple_element, N>::const_reference get(type::tuple const& t); + +template +struct tuple; + +template +typename type::tuple_element, N>::reference get(type::tuple& t); +template +typename type::const_tuple_element, N>::const_reference get(type::tuple const& t); + +template +struct tuple; + +template +typename type::tuple_element, N>::reference get(type::tuple& t); +template +typename type::const_tuple_element, N>::const_reference get(type::tuple const& t); + +template +struct tuple; + +template +typename type::tuple_element, N>::reference get(type::tuple& t); +template +typename type::const_tuple_element, N>::const_reference get(type::tuple const& t); + +template +struct tuple; + +template +typename type::tuple_element, N>::reference get(type::tuple& t); +template +typename type::const_tuple_element, N>::const_reference get(type::tuple const& t); + + +tuple<> make_tuple(); + +template +tuple make_tuple(typename tuple_type::transparent_reference a0); + +template +tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1); + +template +tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2); + +template +tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3); + +template +tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4); + +template +tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5); + +template +tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6); + +template +tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6, typename tuple_type::transparent_reference a7); + +template +tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6, typename tuple_type::transparent_reference a7, typename tuple_type::transparent_reference a8); + +template +tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6, typename tuple_type::transparent_reference a7, typename tuple_type::transparent_reference a8, typename tuple_type::transparent_reference a9); + +template +tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6, typename tuple_type::transparent_reference a7, typename tuple_type::transparent_reference a8, typename tuple_type::transparent_reference a9, typename tuple_type::transparent_reference a10); + +template +tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6, typename tuple_type::transparent_reference a7, typename tuple_type::transparent_reference a8, typename tuple_type::transparent_reference a9, typename tuple_type::transparent_reference a10, typename tuple_type::transparent_reference a11); + +template +tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6, typename tuple_type::transparent_reference a7, typename tuple_type::transparent_reference a8, typename tuple_type::transparent_reference a9, typename tuple_type::transparent_reference a10, typename tuple_type::transparent_reference a11, typename tuple_type::transparent_reference a12); + +template +tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6, typename tuple_type::transparent_reference a7, typename tuple_type::transparent_reference a8, typename tuple_type::transparent_reference a9, typename tuple_type::transparent_reference a10, typename tuple_type::transparent_reference a11, typename tuple_type::transparent_reference a12, typename tuple_type::transparent_reference a13); + +template +tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6, typename tuple_type::transparent_reference a7, typename tuple_type::transparent_reference a8, typename tuple_type::transparent_reference a9, typename tuple_type::transparent_reference a10, typename tuple_type::transparent_reference a11, typename tuple_type::transparent_reference a12, typename tuple_type::transparent_reference a13, typename tuple_type::transparent_reference a14); + +template +tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6, typename tuple_type::transparent_reference a7, typename tuple_type::transparent_reference a8, typename tuple_type::transparent_reference a9, typename tuple_type::transparent_reference a10, typename tuple_type::transparent_reference a11, typename tuple_type::transparent_reference a12, typename tuple_type::transparent_reference a13, typename tuple_type::transparent_reference a14, typename tuple_type::transparent_reference a15); + +template +tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6, typename tuple_type::transparent_reference a7, typename tuple_type::transparent_reference a8, typename tuple_type::transparent_reference a9, typename tuple_type::transparent_reference a10, typename tuple_type::transparent_reference a11, typename tuple_type::transparent_reference a12, typename tuple_type::transparent_reference a13, typename tuple_type::transparent_reference a14, typename tuple_type::transparent_reference a15, typename tuple_type::transparent_reference a16); + +template +tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6, typename tuple_type::transparent_reference a7, typename tuple_type::transparent_reference a8, typename tuple_type::transparent_reference a9, typename tuple_type::transparent_reference a10, typename tuple_type::transparent_reference a11, typename tuple_type::transparent_reference a12, typename tuple_type::transparent_reference a13, typename tuple_type::transparent_reference a14, typename tuple_type::transparent_reference a15, typename tuple_type::transparent_reference a16, typename tuple_type::transparent_reference a17); + +template +tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6, typename tuple_type::transparent_reference a7, typename tuple_type::transparent_reference a8, typename tuple_type::transparent_reference a9, typename tuple_type::transparent_reference a10, typename tuple_type::transparent_reference a11, typename tuple_type::transparent_reference a12, typename tuple_type::transparent_reference a13, typename tuple_type::transparent_reference a14, typename tuple_type::transparent_reference a15, typename tuple_type::transparent_reference a16, typename tuple_type::transparent_reference a17, typename tuple_type::transparent_reference a18); + +template +tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6, typename tuple_type::transparent_reference a7, typename tuple_type::transparent_reference a8, typename tuple_type::transparent_reference a9, typename tuple_type::transparent_reference a10, typename tuple_type::transparent_reference a11, typename tuple_type::transparent_reference a12, typename tuple_type::transparent_reference a13, typename tuple_type::transparent_reference a14, typename tuple_type::transparent_reference a15, typename tuple_type::transparent_reference a16, typename tuple_type::transparent_reference a17, typename tuple_type::transparent_reference a18, typename tuple_type::transparent_reference a19); + +template +tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6, typename tuple_type::transparent_reference a7, typename tuple_type::transparent_reference a8, typename tuple_type::transparent_reference a9, typename tuple_type::transparent_reference a10, typename tuple_type::transparent_reference a11, typename tuple_type::transparent_reference a12, typename tuple_type::transparent_reference a13, typename tuple_type::transparent_reference a14, typename tuple_type::transparent_reference a15, typename tuple_type::transparent_reference a16, typename tuple_type::transparent_reference a17, typename tuple_type::transparent_reference a18, typename tuple_type::transparent_reference a19, typename tuple_type::transparent_reference a20); + +template +tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6, typename tuple_type::transparent_reference a7, typename tuple_type::transparent_reference a8, typename tuple_type::transparent_reference a9, typename tuple_type::transparent_reference a10, typename tuple_type::transparent_reference a11, typename tuple_type::transparent_reference a12, typename tuple_type::transparent_reference a13, typename tuple_type::transparent_reference a14, typename tuple_type::transparent_reference a15, typename tuple_type::transparent_reference a16, typename tuple_type::transparent_reference a17, typename tuple_type::transparent_reference a18, typename tuple_type::transparent_reference a19, typename tuple_type::transparent_reference a20, typename tuple_type::transparent_reference a21); + +template +tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6, typename tuple_type::transparent_reference a7, typename tuple_type::transparent_reference a8, typename tuple_type::transparent_reference a9, typename tuple_type::transparent_reference a10, typename tuple_type::transparent_reference a11, typename tuple_type::transparent_reference a12, typename tuple_type::transparent_reference a13, typename tuple_type::transparent_reference a14, typename tuple_type::transparent_reference a15, typename tuple_type::transparent_reference a16, typename tuple_type::transparent_reference a17, typename tuple_type::transparent_reference a18, typename tuple_type::transparent_reference a19, typename tuple_type::transparent_reference a20, typename tuple_type::transparent_reference a21, typename tuple_type::transparent_reference a22); + +template +tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6, typename tuple_type::transparent_reference a7, typename tuple_type::transparent_reference a8, typename tuple_type::transparent_reference a9, typename tuple_type::transparent_reference a10, typename tuple_type::transparent_reference a11, typename tuple_type::transparent_reference a12, typename tuple_type::transparent_reference a13, typename tuple_type::transparent_reference a14, typename tuple_type::transparent_reference a15, typename tuple_type::transparent_reference a16, typename tuple_type::transparent_reference a17, typename tuple_type::transparent_reference a18, typename tuple_type::transparent_reference a19, typename tuple_type::transparent_reference a20, typename tuple_type::transparent_reference a21, typename tuple_type::transparent_reference a22, typename tuple_type::transparent_reference a23); + +template +tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6, typename tuple_type::transparent_reference a7, typename tuple_type::transparent_reference a8, typename tuple_type::transparent_reference a9, typename tuple_type::transparent_reference a10, typename tuple_type::transparent_reference a11, typename tuple_type::transparent_reference a12, typename tuple_type::transparent_reference a13, typename tuple_type::transparent_reference a14, typename tuple_type::transparent_reference a15, typename tuple_type::transparent_reference a16, typename tuple_type::transparent_reference a17, typename tuple_type::transparent_reference a18, typename tuple_type::transparent_reference a19, typename tuple_type::transparent_reference a20, typename tuple_type::transparent_reference a21, typename tuple_type::transparent_reference a22, typename tuple_type::transparent_reference a23, typename tuple_type::transparent_reference a24); + +template +tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6, typename tuple_type::transparent_reference a7, typename tuple_type::transparent_reference a8, typename tuple_type::transparent_reference a9, typename tuple_type::transparent_reference a10, typename tuple_type::transparent_reference a11, typename tuple_type::transparent_reference a12, typename tuple_type::transparent_reference a13, typename tuple_type::transparent_reference a14, typename tuple_type::transparent_reference a15, typename tuple_type::transparent_reference a16, typename tuple_type::transparent_reference a17, typename tuple_type::transparent_reference a18, typename tuple_type::transparent_reference a19, typename tuple_type::transparent_reference a20, typename tuple_type::transparent_reference a21, typename tuple_type::transparent_reference a22, typename tuple_type::transparent_reference a23, typename tuple_type::transparent_reference a24, typename tuple_type::transparent_reference a25); + +template +tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6, typename tuple_type::transparent_reference a7, typename tuple_type::transparent_reference a8, typename tuple_type::transparent_reference a9, typename tuple_type::transparent_reference a10, typename tuple_type::transparent_reference a11, typename tuple_type::transparent_reference a12, typename tuple_type::transparent_reference a13, typename tuple_type::transparent_reference a14, typename tuple_type::transparent_reference a15, typename tuple_type::transparent_reference a16, typename tuple_type::transparent_reference a17, typename tuple_type::transparent_reference a18, typename tuple_type::transparent_reference a19, typename tuple_type::transparent_reference a20, typename tuple_type::transparent_reference a21, typename tuple_type::transparent_reference a22, typename tuple_type::transparent_reference a23, typename tuple_type::transparent_reference a24, typename tuple_type::transparent_reference a25, typename tuple_type::transparent_reference a26); + +template +tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6, typename tuple_type::transparent_reference a7, typename tuple_type::transparent_reference a8, typename tuple_type::transparent_reference a9, typename tuple_type::transparent_reference a10, typename tuple_type::transparent_reference a11, typename tuple_type::transparent_reference a12, typename tuple_type::transparent_reference a13, typename tuple_type::transparent_reference a14, typename tuple_type::transparent_reference a15, typename tuple_type::transparent_reference a16, typename tuple_type::transparent_reference a17, typename tuple_type::transparent_reference a18, typename tuple_type::transparent_reference a19, typename tuple_type::transparent_reference a20, typename tuple_type::transparent_reference a21, typename tuple_type::transparent_reference a22, typename tuple_type::transparent_reference a23, typename tuple_type::transparent_reference a24, typename tuple_type::transparent_reference a25, typename tuple_type::transparent_reference a26, typename tuple_type::transparent_reference a27); + +template +tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6, typename tuple_type::transparent_reference a7, typename tuple_type::transparent_reference a8, typename tuple_type::transparent_reference a9, typename tuple_type::transparent_reference a10, typename tuple_type::transparent_reference a11, typename tuple_type::transparent_reference a12, typename tuple_type::transparent_reference a13, typename tuple_type::transparent_reference a14, typename tuple_type::transparent_reference a15, typename tuple_type::transparent_reference a16, typename tuple_type::transparent_reference a17, typename tuple_type::transparent_reference a18, typename tuple_type::transparent_reference a19, typename tuple_type::transparent_reference a20, typename tuple_type::transparent_reference a21, typename tuple_type::transparent_reference a22, typename tuple_type::transparent_reference a23, typename tuple_type::transparent_reference a24, typename tuple_type::transparent_reference a25, typename tuple_type::transparent_reference a26, typename tuple_type::transparent_reference a27, typename tuple_type::transparent_reference a28); + +template +tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6, typename tuple_type::transparent_reference a7, typename tuple_type::transparent_reference a8, typename tuple_type::transparent_reference a9, typename tuple_type::transparent_reference a10, typename tuple_type::transparent_reference a11, typename tuple_type::transparent_reference a12, typename tuple_type::transparent_reference a13, typename tuple_type::transparent_reference a14, typename tuple_type::transparent_reference a15, typename tuple_type::transparent_reference a16, typename tuple_type::transparent_reference a17, typename tuple_type::transparent_reference a18, typename tuple_type::transparent_reference a19, typename tuple_type::transparent_reference a20, typename tuple_type::transparent_reference a21, typename tuple_type::transparent_reference a22, typename tuple_type::transparent_reference a23, typename tuple_type::transparent_reference a24, typename tuple_type::transparent_reference a25, typename tuple_type::transparent_reference a26, typename tuple_type::transparent_reference a27, typename tuple_type::transparent_reference a28, typename tuple_type::transparent_reference a29); + +template +tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6, typename tuple_type::transparent_reference a7, typename tuple_type::transparent_reference a8, typename tuple_type::transparent_reference a9, typename tuple_type::transparent_reference a10, typename tuple_type::transparent_reference a11, typename tuple_type::transparent_reference a12, typename tuple_type::transparent_reference a13, typename tuple_type::transparent_reference a14, typename tuple_type::transparent_reference a15, typename tuple_type::transparent_reference a16, typename tuple_type::transparent_reference a17, typename tuple_type::transparent_reference a18, typename tuple_type::transparent_reference a19, typename tuple_type::transparent_reference a20, typename tuple_type::transparent_reference a21, typename tuple_type::transparent_reference a22, typename tuple_type::transparent_reference a23, typename tuple_type::transparent_reference a24, typename tuple_type::transparent_reference a25, typename tuple_type::transparent_reference a26, typename tuple_type::transparent_reference a27, typename tuple_type::transparent_reference a28, typename tuple_type::transparent_reference a29, typename tuple_type::transparent_reference a30); + +template +tuple make_tuple(typename tuple_type::transparent_reference a0, typename tuple_type::transparent_reference a1, typename tuple_type::transparent_reference a2, typename tuple_type::transparent_reference a3, typename tuple_type::transparent_reference a4, typename tuple_type::transparent_reference a5, typename tuple_type::transparent_reference a6, typename tuple_type::transparent_reference a7, typename tuple_type::transparent_reference a8, typename tuple_type::transparent_reference a9, typename tuple_type::transparent_reference a10, typename tuple_type::transparent_reference a11, typename tuple_type::transparent_reference a12, typename tuple_type::transparent_reference a13, typename tuple_type::transparent_reference a14, typename tuple_type::transparent_reference a15, typename tuple_type::transparent_reference a16, typename tuple_type::transparent_reference a17, typename tuple_type::transparent_reference a18, typename tuple_type::transparent_reference a19, typename tuple_type::transparent_reference a20, typename tuple_type::transparent_reference a21, typename tuple_type::transparent_reference a22, typename tuple_type::transparent_reference a23, typename tuple_type::transparent_reference a24, typename tuple_type::transparent_reference a25, typename tuple_type::transparent_reference a26, typename tuple_type::transparent_reference a27, typename tuple_type::transparent_reference a28, typename tuple_type::transparent_reference a29, typename tuple_type::transparent_reference a30, typename tuple_type::transparent_reference a31); + + +} // namespace type + +object const& operator>> ( + object const& o, + type::tuple<>&); + + +template +object const& operator>> ( + object const& o, + type::tuple& v); + +template +object const& operator>> ( + object const& o, + type::tuple& v); + +template +object const& operator>> ( + object const& o, + type::tuple& v); + +template +object const& operator>> ( + object const& o, + type::tuple& v); + +template +object const& operator>> ( + object const& o, + type::tuple& v); + +template +object const& operator>> ( + object const& o, + type::tuple& v); + +template +object const& operator>> ( + object const& o, + type::tuple& v); + +template +object const& operator>> ( + object const& o, + type::tuple& v); + +template +object const& operator>> ( + object const& o, + type::tuple& v); + +template +object const& operator>> ( + object const& o, + type::tuple& v); + +template +object const& operator>> ( + object const& o, + type::tuple& v); + +template +object const& operator>> ( + object const& o, + type::tuple& v); + +template +object const& operator>> ( + object const& o, + type::tuple& v); + +template +object const& operator>> ( + object const& o, + type::tuple& v); + +template +object const& operator>> ( + object const& o, + type::tuple& v); + +template +object const& operator>> ( + object const& o, + type::tuple& v); + +template +object const& operator>> ( + object const& o, + type::tuple& v); + +template +object const& operator>> ( + object const& o, + type::tuple& v); + +template +object const& operator>> ( + object const& o, + type::tuple& v); + +template +object const& operator>> ( + object const& o, + type::tuple& v); + +template +object const& operator>> ( + object const& o, + type::tuple& v); + +template +object const& operator>> ( + object const& o, + type::tuple& v); + +template +object const& operator>> ( + object const& o, + type::tuple& v); + +template +object const& operator>> ( + object const& o, + type::tuple& v); + +template +object const& operator>> ( + object const& o, + type::tuple& v); + +template +object const& operator>> ( + object const& o, + type::tuple& v); + +template +object const& operator>> ( + object const& o, + type::tuple& v); + +template +object const& operator>> ( + object const& o, + type::tuple& v); + +template +object const& operator>> ( + object const& o, + type::tuple& v); + +template +object const& operator>> ( + object const& o, + type::tuple& v); + +template +object const& operator>> ( + object const& o, + type::tuple& v); + +template +object const& operator>> ( + object const& o, + type::tuple& v); + + +template +const packer& operator<< ( + packer& o, + const type::tuple<>&); + + +template +const packer& operator<< ( + packer& o, + const type::tuple& v); + +template +const packer& operator<< ( + packer& o, + const type::tuple& v); + +template +const packer& operator<< ( + packer& o, + const type::tuple& v); + +template +const packer& operator<< ( + packer& o, + const type::tuple& v); + +template +const packer& operator<< ( + packer& o, + const type::tuple& v); + +template +const packer& operator<< ( + packer& o, + const type::tuple& v); + +template +const packer& operator<< ( + packer& o, + const type::tuple& v); + +template +const packer& operator<< ( + packer& o, + const type::tuple& v); + +template +const packer& operator<< ( + packer& o, + const type::tuple& v); + +template +const packer& operator<< ( + packer& o, + const type::tuple& v); + +template +const packer& operator<< ( + packer& o, + const type::tuple& v); + +template +const packer& operator<< ( + packer& o, + const type::tuple& v); + +template +const packer& operator<< ( + packer& o, + const type::tuple& v); + +template +const packer& operator<< ( + packer& o, + const type::tuple& v); + +template +const packer& operator<< ( + packer& o, + const type::tuple& v); + +template +const packer& operator<< ( + packer& o, + const type::tuple& v); + +template +const packer& operator<< ( + packer& o, + const type::tuple& v); + +template +const packer& operator<< ( + packer& o, + const type::tuple& v); + +template +const packer& operator<< ( + packer& o, + const type::tuple& v); + +template +const packer& operator<< ( + packer& o, + const type::tuple& v); + +template +const packer& operator<< ( + packer& o, + const type::tuple& v); + +template +const packer& operator<< ( + packer& o, + const type::tuple& v); + +template +const packer& operator<< ( + packer& o, + const type::tuple& v); + +template +const packer& operator<< ( + packer& o, + const type::tuple& v); + +template +const packer& operator<< ( + packer& o, + const type::tuple& v); + +template +const packer& operator<< ( + packer& o, + const type::tuple& v); + +template +const packer& operator<< ( + packer& o, + const type::tuple& v); + +template +const packer& operator<< ( + packer& o, + const type::tuple& v); + +template +const packer& operator<< ( + packer& o, + const type::tuple& v); + +template +const packer& operator<< ( + packer& o, + const type::tuple& v); + +template +const packer& operator<< ( + packer& o, + const type::tuple& v); + +template +const packer& operator<< ( + packer& o, + const type::tuple& v); + + +void operator<< ( + object::with_zone& o, + const type::tuple<>&); + +template +void operator<< ( + object::with_zone& o, + const type::tuple& v); + +template +void operator<< ( + object::with_zone& o, + const type::tuple& v); + +template +void operator<< ( + object::with_zone& o, + const type::tuple& v); + +template +void operator<< ( + object::with_zone& o, + const type::tuple& v); + +template +void operator<< ( + object::with_zone& o, + const type::tuple& v); + +template +void operator<< ( + object::with_zone& o, + const type::tuple& v); + +template +void operator<< ( + object::with_zone& o, + const type::tuple& v); + +template +void operator<< ( + object::with_zone& o, + const type::tuple& v); + +template +void operator<< ( + object::with_zone& o, + const type::tuple& v); + +template +void operator<< ( + object::with_zone& o, + const type::tuple& v); + +template +void operator<< ( + object::with_zone& o, + const type::tuple& v); + +template +void operator<< ( + object::with_zone& o, + const type::tuple& v); + +template +void operator<< ( + object::with_zone& o, + const type::tuple& v); + +template +void operator<< ( + object::with_zone& o, + const type::tuple& v); + +template +void operator<< ( + object::with_zone& o, + const type::tuple& v); + +template +void operator<< ( + object::with_zone& o, + const type::tuple& v); + +template +void operator<< ( + object::with_zone& o, + const type::tuple& v); + +template +void operator<< ( + object::with_zone& o, + const type::tuple& v); + +template +void operator<< ( + object::with_zone& o, + const type::tuple& v); + +template +void operator<< ( + object::with_zone& o, + const type::tuple& v); + +template +void operator<< ( + object::with_zone& o, + const type::tuple& v); + +template +void operator<< ( + object::with_zone& o, + const type::tuple& v); + +template +void operator<< ( + object::with_zone& o, + const type::tuple& v); + +template +void operator<< ( + object::with_zone& o, + const type::tuple& v); + +template +void operator<< ( + object::with_zone& o, + const type::tuple& v); + +template +void operator<< ( + object::with_zone& o, + const type::tuple& v); + +template +void operator<< ( + object::with_zone& o, + const type::tuple& v); + +template +void operator<< ( + object::with_zone& o, + const type::tuple& v); + +template +void operator<< ( + object::with_zone& o, + const type::tuple& v); + +template +void operator<< ( + object::with_zone& o, + const type::tuple& v); + +template +void operator<< ( + object::with_zone& o, + const type::tuple& v); + +template +void operator<< ( + object::with_zone& o, + const type::tuple& v); + + +} // MSGPACK_API_VERSION_NAMESPACE(v1) + +} // namespace msgpack + + +//std::ostream& operator<< (std::ostream& o, const msgpack::type::tuple<>& v); +// +//template +//std::ostream& operator<< (std::ostream& o, +// const msgpack::type::tuple& v); +// +//template +//std::ostream& operator<< (std::ostream& o, +// const msgpack::type::tuple& v); +// +//template +//std::ostream& operator<< (std::ostream& o, +// const msgpack::type::tuple& v); +// +//template +//std::ostream& operator<< (std::ostream& o, +// const msgpack::type::tuple& v); +// +//template +//std::ostream& operator<< (std::ostream& o, +// const msgpack::type::tuple& v); +// +//template +//std::ostream& operator<< (std::ostream& o, +// const msgpack::type::tuple& v); +// +//template +//std::ostream& operator<< (std::ostream& o, +// const msgpack::type::tuple& v); +// +//template +//std::ostream& operator<< (std::ostream& o, +// const msgpack::type::tuple& v); +// +//template +//std::ostream& operator<< (std::ostream& o, +// const msgpack::type::tuple& v); +// +//template +//std::ostream& operator<< (std::ostream& o, +// const msgpack::type::tuple& v); +// +//template +//std::ostream& operator<< (std::ostream& o, +// const msgpack::type::tuple& v); +// +//template +//std::ostream& operator<< (std::ostream& o, +// const msgpack::type::tuple& v); +// +//template +//std::ostream& operator<< (std::ostream& o, +// const msgpack::type::tuple& v); +// +//template +//std::ostream& operator<< (std::ostream& o, +// const msgpack::type::tuple& v); +// +//template +//std::ostream& operator<< (std::ostream& o, +// const msgpack::type::tuple& v); +// +//template +//std::ostream& operator<< (std::ostream& o, +// const msgpack::type::tuple& v); +// +//template +//std::ostream& operator<< (std::ostream& o, +// const msgpack::type::tuple& v); +// +//template +//std::ostream& operator<< (std::ostream& o, +// const msgpack::type::tuple& v); +// +//template +//std::ostream& operator<< (std::ostream& o, +// const msgpack::type::tuple& v); +// +//template +//std::ostream& operator<< (std::ostream& o, +// const msgpack::type::tuple& v); +// +//template +//std::ostream& operator<< (std::ostream& o, +// const msgpack::type::tuple& v); +// +//template +//std::ostream& operator<< (std::ostream& o, +// const msgpack::type::tuple& v); +// +//template +//std::ostream& operator<< (std::ostream& o, +// const msgpack::type::tuple& v); +// +//template +//std::ostream& operator<< (std::ostream& o, +// const msgpack::type::tuple& v); +// +//template +//std::ostream& operator<< (std::ostream& o, +// const msgpack::type::tuple& v); +// +//template +//std::ostream& operator<< (std::ostream& o, +// const msgpack::type::tuple& v); +// +//template +//std::ostream& operator<< (std::ostream& o, +// const msgpack::type::tuple& v); +// +//template +//std::ostream& operator<< (std::ostream& o, +// const msgpack::type::tuple& v); +// +//template +//std::ostream& operator<< (std::ostream& o, +// const msgpack::type::tuple& v); +// +//template +//std::ostream& operator<< (std::ostream& o, +// const msgpack::type::tuple& v); +// +//template +//std::ostream& operator<< (std::ostream& o, +// const msgpack::type::tuple& v); +// +//template +//std::ostream& operator<< (std::ostream& o, +// const msgpack::type::tuple& v); +// + +#endif // MSGPACK_CPP03_MSGPACK_TUPLE_FWD_HPP diff --git a/include/msgpack/adaptor/detail/cpp11_define.hpp b/include/msgpack/adaptor/detail/cpp11_define.hpp index eb955316..6e29b4ad 100644 --- a/include/msgpack/adaptor/detail/cpp11_define.hpp +++ b/include/msgpack/adaptor/detail/cpp11_define.hpp @@ -18,7 +18,14 @@ #ifndef MSGPACK_CPP11_DEFINE_HPP #define MSGPACK_CPP11_DEFINE_HPP +#include "msgpack/versioning.hpp" +#include "msgpack/object_fwd.hpp" + +// for MSGPACK_ADD_ENUM +#include "msgpack/adaptor/int_fwd.hpp" + #include +#include #define MSGPACK_DEFINE(...) \ template \ @@ -39,6 +46,7 @@ // MSGPACK_ADD_ENUM must be used in the global namespace. #define MSGPACK_ADD_ENUM(enum) \ namespace msgpack { \ + MSGPACK_API_VERSION_NAMESPACE(v1) { \ template <> \ inline object const& operator>> (object const& o, enum& v) \ { \ @@ -61,9 +69,11 @@ } \ }; \ } \ + } \ } namespace msgpack { +MSGPACK_API_VERSION_NAMESPACE(v1) { namespace type { template @@ -104,7 +114,7 @@ struct define_imp { template struct define { typedef define value_type; - typedef tuple tuple_type; + typedef std::tuple tuple_type; define(Args&... args) : a(args...) {} template @@ -112,13 +122,13 @@ struct define { { pk.pack_array(sizeof...(Args)); - define_imp, sizeof...(Args)>::pack(pk, a); + define_imp, sizeof...(Args)>::pack(pk, a); } void msgpack_unpack(msgpack::object const& o) { if(o.type != type::ARRAY) { throw type_error(); } - define_imp, sizeof...(Args)>::unpack(o, a); + define_imp, sizeof...(Args)>::unpack(o, a); } void msgpack_object(msgpack::object* o, msgpack::zone& z) const { @@ -126,16 +136,16 @@ struct define { o->via.array.ptr = static_cast(z.allocate_align(sizeof(object)*sizeof...(Args))); o->via.array.size = sizeof...(Args); - define_imp, sizeof...(Args)>::object(o, z, a); + define_imp, sizeof...(Args)>::object(o, z, a); } - tuple a; + std::tuple a; }; template <> struct define<> { typedef define<> value_type; - typedef tuple<> tuple_type; + typedef std::tuple<> tuple_type; template void msgpack_pack(Packer& pk) const { @@ -165,6 +175,7 @@ define make_define(Args&... args) } } // namespace type +} // MSGPACK_API_VERSION_NAMESPACE(v1) } // namespace msgpack #endif // MSGPACK_CPP11_DEFINE_HPP diff --git a/include/msgpack/adaptor/detail/cpp11_msgpack_tuple.hpp b/include/msgpack/adaptor/detail/cpp11_msgpack_tuple.hpp index 8b5aa607..3b532d87 100644 --- a/include/msgpack/adaptor/detail/cpp11_msgpack_tuple.hpp +++ b/include/msgpack/adaptor/detail/cpp11_msgpack_tuple.hpp @@ -18,13 +18,15 @@ #ifndef MSGPACK_CPP11_MSGPACK_TUPLE_HPP #define MSGPACK_CPP11_MSGPACK_TUPLE_HPP +#include "msgpack/versioning.hpp" +#include "msgpack/object_fwd.hpp" + #include -#include "msgpack/object.hpp" -#include "msgpack/cpp_config.hpp" - namespace msgpack { +MSGPACK_API_VERSION_NAMESPACE(v1) { + namespace type { // tuple using std::get; @@ -203,6 +205,8 @@ inline void operator<< ( MsgpackTupleToObjectWithZone::convert(o, v); } -} // msgpack +} // MSGPACK_API_VERSION_NAMESPACE(v1) + +} // namespace msgpack #endif // MSGPACK_CPP11_MSGPACK_TUPLE_HPP diff --git a/include/msgpack/adaptor/detail/cpp11_msgpack_tuple_fwd.hpp b/include/msgpack/adaptor/detail/cpp11_msgpack_tuple_fwd.hpp new file mode 100644 index 00000000..b9f148ef --- /dev/null +++ b/include/msgpack/adaptor/detail/cpp11_msgpack_tuple_fwd.hpp @@ -0,0 +1,84 @@ +// +// MessagePack for C++ static resolution routine +// +// Copyright (C) 2008-2014 FURUHASHI Sadayuki and KONDO Takatoshi +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#ifndef MSGPACK_CPP11_MSGPACK_TUPLE_FWD_HPP +#define MSGPACK_CPP11_MSGPACK_TUPLE_FWD_HPP + +#include "msgpack/versioning.hpp" +#include "msgpack/object_fwd.hpp" + +#include + +namespace msgpack { + +MSGPACK_API_VERSION_NAMESPACE(v1) { + +namespace type { + // tuple + using std::get; + using std::tuple_size; + using std::tuple_element; + using std::uses_allocator; + using std::ignore; + using std::make_tuple; + using std::tie; + using std::forward_as_tuple; + using std::swap; + + template< class... Types > + class tuple; + + template< class... Tuples > + auto tuple_cat(Tuples&&... args) -> + decltype( + std::tuple_cat(std::forward::type::base>(args)...) + ); +} // namespace type + +// --- Pack ( from tuple to packer stream --- +template +struct MsgpackTuplePacker; + +template +const packer& operator<< ( + packer& o, + const type::tuple& v); + +// --- Convert from tuple to object --- + +template +struct MsgpackTupleConverter; + +template +object const& operator>> ( + object const& o, + type::tuple& v); + +// --- Convert from tuple to object with zone --- +template +struct MsgpackTupleToObjectWithZone; + +template +void operator<< ( + object::with_zone& o, + type::tuple const& v); + +} // MSGPACK_API_VERSION_NAMESPACE(v1) + +} // namespace msgpack + +#endif // MSGPACK_CPP11_MSGPACK_TUPLE_FWD_HPP diff --git a/include/msgpack/adaptor/fixint.hpp b/include/msgpack/adaptor/fixint.hpp index b395850a..eb7f7a8a 100644 --- a/include/msgpack/adaptor/fixint.hpp +++ b/include/msgpack/adaptor/fixint.hpp @@ -18,11 +18,14 @@ #ifndef MSGPACK_TYPE_FIXINT_HPP #define MSGPACK_TYPE_FIXINT_HPP -#include "msgpack/object.hpp" +#include "msgpack/versioning.hpp" +#include "msgpack/object_fwd.hpp" #include "msgpack/adaptor/int.hpp" namespace msgpack { +MSGPACK_API_VERSION_NAMESPACE(v1) { + namespace type { @@ -202,6 +205,8 @@ inline void operator<< (object::with_zone& o, type::fix_uint64 v) { static_cast(o) << v; } +} // MSGPACK_API_VERSION_NAMESPACE(v1) + } // namespace msgpack #endif /* msgpack/type/fixint.hpp */ diff --git a/include/msgpack/adaptor/fixint_fwd.hpp b/include/msgpack/adaptor/fixint_fwd.hpp new file mode 100644 index 00000000..cad85ebe --- /dev/null +++ b/include/msgpack/adaptor/fixint_fwd.hpp @@ -0,0 +1,100 @@ +// +// MessagePack for C++ static resolution routine +// +// Copyright (C) 2014 FURUHASHI Sadayuki and KONDO Takatoshi +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#ifndef MSGPACK_TYPE_FIXINT_FWD_HPP +#define MSGPACK_TYPE_FIXINT_FWD_HPP + +#include "msgpack/versioning.hpp" +#include "msgpack/object_fwd.hpp" + +namespace msgpack { + +MSGPACK_API_VERSION_NAMESPACE(v1) { + +namespace type { + + +template +struct fix_int; + +typedef fix_int fix_uint8; +typedef fix_int fix_uint16; +typedef fix_int fix_uint32; +typedef fix_int fix_uint64; + +typedef fix_int fix_int8; +typedef fix_int fix_int16; +typedef fix_int fix_int32; +typedef fix_int fix_int64; + + +} // namespace type + + +object const& operator>> (object const& o, type::fix_int8& v); +object const& operator>> (object const& o, type::fix_int16& v); +object const& operator>> (object const& o, type::fix_int32& v); +object const& operator>> (object const& o, type::fix_int64& v); + +object const& operator>> (object const& o, type::fix_uint8& v); +object const& operator>> (object const& o, type::fix_uint16& v); +object const& operator>> (object const& o, type::fix_uint32& v); +object const& operator>> (object const& o, type::fix_uint64& v); + +template +packer& operator<< (packer& o, const type::fix_int8& v); +template +packer& operator<< (packer& o, const type::fix_int16& v); +template +packer& operator<< (packer& o, const type::fix_int32& v); +template +packer& operator<< (packer& o, const type::fix_int64& v); + +template +packer& operator<< (packer& o, const type::fix_uint8& v); +template +packer& operator<< (packer& o, const type::fix_uint16& v); +template +packer& operator<< (packer& o, const type::fix_uint32& v); +template +packer& operator<< (packer& o, const type::fix_uint64& v); + +void operator<< (object& o, type::fix_int8 v); +void operator<< (object& o, type::fix_int16 v); +void operator<< (object& o, type::fix_int32 v); +void operator<< (object& o, type::fix_int64 v); + +void operator<< (object& o, type::fix_uint8 v); +void operator<< (object& o, type::fix_uint16 v); +void operator<< (object& o, type::fix_uint32 v); +void operator<< (object& o, type::fix_uint64 v); + +void operator<< (object::with_zone& o, type::fix_int8 v); +void operator<< (object::with_zone& o, type::fix_int16 v); +void operator<< (object::with_zone& o, type::fix_int32 v); +void operator<< (object::with_zone& o, type::fix_int64 v); + +void operator<< (object::with_zone& o, type::fix_uint8 v); +void operator<< (object::with_zone& o, type::fix_uint16 v); +void operator<< (object::with_zone& o, type::fix_uint32 v); +void operator<< (object::with_zone& o, type::fix_uint64 v); + +} // MSGPACK_API_VERSION_NAMESPACE(v1) + +} // namespace msgpack + +#endif // MSGPACK_TYPE_FIXINT_FWD_HPP diff --git a/include/msgpack/adaptor/float.hpp b/include/msgpack/adaptor/float.hpp index 16470e4b..8191db91 100644 --- a/include/msgpack/adaptor/float.hpp +++ b/include/msgpack/adaptor/float.hpp @@ -18,11 +18,13 @@ #ifndef MSGPACK_TYPE_FLOAT_HPP #define MSGPACK_TYPE_FLOAT_HPP -#include "msgpack/object.hpp" +#include "msgpack/versioning.hpp" +#include "msgpack/object_fwd.hpp" #include namespace msgpack { +MSGPACK_API_VERSION_NAMESPACE(v1) { // FIXME check overflow, underflow @@ -96,6 +98,8 @@ inline void operator<< (object::with_zone& o, double v) { static_cast(o) << v; } +} // MSGPACK_API_VERSION_NAMESPACE(v1) + } // namespace msgpack -#endif /* msgpack/type/float.hpp */ +#endif // MSGPACK_TYPE_FLOAT_HPP diff --git a/include/msgpack/adaptor/float_fwd.hpp b/include/msgpack/adaptor/float_fwd.hpp new file mode 100644 index 00000000..5eb9bafb --- /dev/null +++ b/include/msgpack/adaptor/float_fwd.hpp @@ -0,0 +1,44 @@ +// +// MessagePack for C++ static resolution routine +// +// Copyright (C) 2008-2014 FURUHASHI Sadayuki and KONDO Takatoshi +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#ifndef MSGPACK_TYPE_FLOAT_FWD_HPP +#define MSGPACK_TYPE_FLOAT_FWD_HPP + +#include "msgpack/versioning.hpp" +#include "msgpack/object_fwd.hpp" +#include + +namespace msgpack { + +MSGPACK_API_VERSION_NAMESPACE(v1) { + +object const& operator>> (object const& o, float& v); +template +packer& operator<< (packer& o, const float& v); +object const& operator>> (object const& o, double& v); +template +packer& operator<< (packer& o, const double& v); +void operator<< (object& o, float v); +void operator<< (object& o, double v); +void operator<< (object::with_zone& o, float v); +void operator<< (object::with_zone& o, double v); + +} // MSGPACK_API_VERSION_NAMESPACE(v1) + +} // namespace msgpack + +#endif // MSGPACK_TYPE_FLOAT_FWD_HPP diff --git a/include/msgpack/adaptor/int.hpp b/include/msgpack/adaptor/int.hpp index 305af663..51c0021e 100644 --- a/include/msgpack/adaptor/int.hpp +++ b/include/msgpack/adaptor/int.hpp @@ -18,11 +18,13 @@ #ifndef MSGPACK_TYPE_INT_HPP #define MSGPACK_TYPE_INT_HPP -#include "msgpack/object.hpp" +#include "msgpack/versioning.hpp" +#include "msgpack_fwd.hpp" #include namespace msgpack { +MSGPACK_API_VERSION_NAMESPACE(v1){ namespace type { namespace detail { @@ -323,6 +325,8 @@ inline void operator<< (object::with_zone& o, const unsigned long long& v) { static_cast(o) << v; } +} // MSGPACK_API_VERSION_NAMESPACE(v1) + } // namespace msgpack #endif /* msgpack/type/int.hpp */ diff --git a/include/msgpack/adaptor/int_fwd.hpp b/include/msgpack/adaptor/int_fwd.hpp new file mode 100644 index 00000000..682f6b8e --- /dev/null +++ b/include/msgpack/adaptor/int_fwd.hpp @@ -0,0 +1,100 @@ +// +// MessagePack for C++ forward declaration +// +// Copyright (C) 2008-2014 FURUHASHI Sadayuki and KONDO Takatoshi +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#ifndef MSGPACK_TYPE_INT_FWD_HPP +#define MSGPACK_TYPE_INT_FWD_HPP + +#include "msgpack/versioning.hpp" +#include "msgpack/object_fwd.hpp" + +namespace msgpack { + +MSGPACK_API_VERSION_NAMESPACE(v1){ + +object const& operator>> (object const& o, char& v); + +object const& operator>> (object const& o, signed char& v); +object const& operator>> (object const& o, signed short& v); +object const& operator>> (object const& o, signed int& v); +object const& operator>> (object const& o, signed long& v); +object const& operator>> (object const& o, signed long long& v); + +object const& operator>> (object const& o, unsigned char& v); +object const& operator>> (object const& o, unsigned short& v); +object const& operator>> (object const& o, unsigned int& v); +object const& operator>> (object const& o, unsigned long& v); +object const& operator>> (object const& o, unsigned long long& v); + +template +packer& operator<< (packer& o, char v); + +template +packer& operator<< (packer& o, signed char v); +template +packer& operator<< (packer& o, signed short v); +template +packer& operator<< (packer& o, signed int v); +template +packer& operator<< (packer& o, signed long v); +template +packer& operator<< (packer& o, signed long long v); + +template +packer& operator<< (packer& o, unsigned char v); +template +packer& operator<< (packer& o, unsigned short v); +template +packer& operator<< (packer& o, unsigned int v); +template +packer& operator<< (packer& o, unsigned long v); +template +packer& operator<< (packer& o, unsigned long long v); + + +void operator<< (object& o, char v); + +void operator<< (object& o, signed char v); +void operator<< (object& o, signed short v); +void operator<< (object& o, signed int v); +void operator<< (object& o, signed long v); +void operator<< (object& o, signed long long v); + +void operator<< (object& o, unsigned char v); +void operator<< (object& o, unsigned short v); +void operator<< (object& o, unsigned int v); +void operator<< (object& o, unsigned long v); +void operator<< (object& o, unsigned long long v); + +void operator<< (object::with_zone& o, char v); + +void operator<< (object::with_zone& o, signed char v); +void operator<< (object::with_zone& o, signed short v); +void operator<< (object::with_zone& o, signed int v); +void operator<< (object::with_zone& o, signed long v); +void operator<< (object::with_zone& o, const signed long long& v); + +void operator<< (object::with_zone& o, unsigned char v); +void operator<< (object::with_zone& o, unsigned short v); +void operator<< (object::with_zone& o, unsigned int v); +void operator<< (object::with_zone& o, unsigned long v); +void operator<< (object::with_zone& o, const unsigned long long& v); + +} // MSGPACK_API_VERSION_NAMESPACE(v1) + +} // namespace msgpack + +#endif // MSGPACK_TYPE_INT_FWD_HPP diff --git a/include/msgpack/adaptor/list.hpp b/include/msgpack/adaptor/list.hpp index 048eae00..321f531b 100644 --- a/include/msgpack/adaptor/list.hpp +++ b/include/msgpack/adaptor/list.hpp @@ -18,11 +18,13 @@ #ifndef MSGPACK_TYPE_LIST_HPP #define MSGPACK_TYPE_LIST_HPP -#include "msgpack/object.hpp" +#include "msgpack/versioning.hpp" +#include "msgpack/object_fwd.hpp" #include namespace msgpack { +MSGPACK_API_VERSION_NAMESPACE(v1) { template inline object const& operator>> (object const& o, std::list& v) @@ -70,7 +72,8 @@ inline void operator<< (object::with_zone& o, const std::list& v) } } +} // MSGPACK_API_VERSION_NAMESPACE(v1) } // namespace msgpack -#endif /* msgpack/type/list.hpp */ +#endif // MSGPACK_TYPE_LIST_HPP diff --git a/include/msgpack/adaptor/list_fwd.hpp b/include/msgpack/adaptor/list_fwd.hpp new file mode 100644 index 00000000..814a21a0 --- /dev/null +++ b/include/msgpack/adaptor/list_fwd.hpp @@ -0,0 +1,40 @@ +// +// MessagePack for C++ static resolution routine +// +// Copyright (C) 2008-2009 FURUHASHI Sadayuki +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#ifndef MSGPACK_TYPE_LIST_FWD_HPP +#define MSGPACK_TYPE_LIST_FWD_HPP + +#include "msgpack/versioning.hpp" +#include "msgpack/object_fwd.hpp" +#include + +namespace msgpack { + +MSGPACK_API_VERSION_NAMESPACE(v1) { + +template +object const& operator>> (object const& o, std::list& v); +template +packer& operator<< (packer& o, const std::list& v); +template +void operator<< (object::with_zone& o, const std::list& v); + +} // MSGPACK_API_VERSION_NAMESPACE(v1) + +} // namespace msgpack + +#endif // MSGPACK_TYPE_LIST_FWD_HPP diff --git a/include/msgpack/adaptor/map.hpp b/include/msgpack/adaptor/map.hpp index 4f2e0af0..c8e5c22f 100644 --- a/include/msgpack/adaptor/map.hpp +++ b/include/msgpack/adaptor/map.hpp @@ -18,13 +18,15 @@ #ifndef MSGPACK_TYPE_MAP_HPP #define MSGPACK_TYPE_MAP_HPP -#include "msgpack/object.hpp" +#include "msgpack/versioning.hpp" +#include "msgpack/object_fwd.hpp" #include #include #include namespace msgpack { +MSGPACK_API_VERSION_NAMESPACE(v1) { namespace type { @@ -202,7 +204,8 @@ inline void operator<< (object::with_zone& o, const std::multimap& v) } } +} // MSGPACK_API_VERSION_NAMESPACE(v1) } // namespace msgpack -#endif /* msgpack/type/map.hpp */ +#endif // MSGPACK_TYPE_MAP_HPP diff --git a/include/msgpack/adaptor/map_fwd.hpp b/include/msgpack/adaptor/map_fwd.hpp new file mode 100644 index 00000000..fe5cc6b0 --- /dev/null +++ b/include/msgpack/adaptor/map_fwd.hpp @@ -0,0 +1,69 @@ +// +// MessagePack for C++ static resolution routine +// +// Copyright (C) 2008-2014 FURUHASHI Sadayuki and KONDO Takatoshi +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#ifndef MSGPACK_TYPE_MAP_FWD_HPP +#define MSGPACK_TYPE_MAP_FWD_HPP + +#include "msgpack/versioning.hpp" +#include "msgpack/object_fwd.hpp" +#include +#include +#include + +namespace msgpack { + +MSGPACK_API_VERSION_NAMESPACE(v1) { + +namespace type { + +template +class assoc_vector; + +namespace detail { + template + struct pair_first_less; +} // namespace detail + +} // namespace type + + +template +object const& operator>> (object const& o, type::assoc_vector& v); +template +packer& operator<< (packer& o, const type::assoc_vector& v); +template +void operator<< (object::with_zone& o, const type::assoc_vector& v); + +template +object const& operator>> (object const& o, std::map& v); +template +packer& operator<< (packer& o, const std::map& v); +template +void operator<< (object::with_zone& o, const std::map& v); + +template +object const& operator>> (object const& o, std::multimap& v); +template +packer& operator<< (packer& o, const std::multimap& v); +template +void operator<< (object::with_zone& o, const std::multimap& v); + +} // MSGPACK_API_VERSION_NAMESPACE(v1) + +} // namespace msgpack + +#endif // MSGPACK_TYPE_MAP_HPP diff --git a/include/msgpack/adaptor/msgpack_tuple_fwd.hpp b/include/msgpack/adaptor/msgpack_tuple_fwd.hpp new file mode 100644 index 00000000..12ea8e9b --- /dev/null +++ b/include/msgpack/adaptor/msgpack_tuple_fwd.hpp @@ -0,0 +1,29 @@ +// +// MessagePack for C++ static resolution routine +// +// Copyright (C) 2008-2014 FURUHASHI Sadayuki and KONDO Takatoshi +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#ifndef MSGPACK_MSGPACK_TUPLE_FWD_HPP +#define MSGPACK_MSGPACK_TUPLE_FWD_HPP + +#include "msgpack/cpp_config.hpp" + +#if defined(MSGPACK_USE_CPP03) +#include "detail/cpp03_msgpack_tuple_fwd.hpp" +#else // MSGPACK_USE_CPP03 +#include "detail/cpp11_msgpack_tuple_fwd.hpp" +#endif // MSGPACK_USE_CPP03 + +#endif // MSGPACK_MSGPACK_TUPLE_FWD_HPP diff --git a/include/msgpack/adaptor/nil.hpp b/include/msgpack/adaptor/nil.hpp index f52d4ffe..4b092e28 100644 --- a/include/msgpack/adaptor/nil.hpp +++ b/include/msgpack/adaptor/nil.hpp @@ -18,10 +18,13 @@ #ifndef MSGPACK_TYPE_NIL_HPP #define MSGPACK_TYPE_NIL_HPP -#include "msgpack/object.hpp" +#include "msgpack/versioning.hpp" +#include "msgpack/object_fwd.hpp" namespace msgpack { +MSGPACK_API_VERSION_NAMESPACE(v1) { + namespace type { struct nil { }; @@ -58,7 +61,8 @@ inline void object::as() const convert(v); } +} // MSGPACK_API_VERSION_NAMESPACE(v1) } // namespace msgpack -#endif /* msgpack/type/nil.hpp */ +#endif // MSGPACK_TYPE_NIL_HPP diff --git a/include/msgpack/adaptor/nil_fwd.hpp b/include/msgpack/adaptor/nil_fwd.hpp new file mode 100644 index 00000000..80d14860 --- /dev/null +++ b/include/msgpack/adaptor/nil_fwd.hpp @@ -0,0 +1,51 @@ +// +// MessagePack for C++ static resolution routine +// +// Copyright (C) 2008-2014 FURUHASHI Sadayuki and KONDO Takatoshi +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#ifndef MSGPACK_TYPE_NIL_FWD_HPP +#define MSGPACK_TYPE_NIL_FWD_HPP + +#include "msgpack/versioning.hpp" +#include "msgpack/object_fwd.hpp" + +namespace msgpack { + +MSGPACK_API_VERSION_NAMESPACE(v1) { + +namespace type { + +struct nil; + +} // namespace type + + +object const& operator>> (object const& o, type::nil&); + +template +packer& operator<< (packer& o, const type::nil&); + +void operator<< (object& o, type::nil); + +void operator<< (object::with_zone& o, type::nil v); + +template <> +inline void object::as() const; + +} // MSGPACK_API_VERSION_NAMESPACE(v1) + +} // namespace msgpack + +#endif // MSGPACK_TYPE_NIL_FWD_HPP diff --git a/include/msgpack/adaptor/pair.hpp b/include/msgpack/adaptor/pair.hpp index 851d00c3..27b88fae 100644 --- a/include/msgpack/adaptor/pair.hpp +++ b/include/msgpack/adaptor/pair.hpp @@ -18,11 +18,13 @@ #ifndef MSGPACK_TYPE_PAIR_HPP #define MSGPACK_TYPE_PAIR_HPP -#include "msgpack/object.hpp" +#include "msgpack/versioning.hpp" +#include "msgpack/object_fwd.hpp" #include namespace msgpack { +MSGPACK_API_VERSION_NAMESPACE(v1) { template inline object const& operator>> (object const& o, std::pair& v) @@ -54,7 +56,8 @@ inline void operator<< (object::with_zone& o, const std::pair& v) p[1] = object(v.second, o.zone); } +} // MSGPACK_API_VERSION_NAMESPACE(v1) } // namespace msgpack -#endif /* msgpack/type/pair.hpp */ +#endif // MSGPACK_TYPE_PAIR_HPP diff --git a/include/msgpack/adaptor/pair_fwd.hpp b/include/msgpack/adaptor/pair_fwd.hpp new file mode 100644 index 00000000..d6d84d39 --- /dev/null +++ b/include/msgpack/adaptor/pair_fwd.hpp @@ -0,0 +1,42 @@ +// +// MessagePack for C++ static resolution routine +// +// Copyright (C) 2008-2009 FURUHASHI Sadayuki +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#ifndef MSGPACK_TYPE_PAIR_FWD_HPP +#define MSGPACK_TYPE_PAIR_FWD_HPP + +#include "msgpack/versioning.hpp" +#include "msgpack/object_fwd.hpp" +#include + +namespace msgpack { + +MSGPACK_API_VERSION_NAMESPACE(v1) { + +template +object const& operator>> (object const& o, std::pair& v); + +template +packer& operator<< (packer& o, const std::pair& v); + +template +void operator<< (object::with_zone& o, const std::pair& v); + +} // MSGPACK_API_VERSION_NAMESPACE(v1) + +} // namespace msgpack + +#endif // MSGPACK_TYPE_PAIR_FWD_HPP diff --git a/include/msgpack/adaptor/raw.hpp b/include/msgpack/adaptor/raw.hpp index e2268607..590b5de7 100644 --- a/include/msgpack/adaptor/raw.hpp +++ b/include/msgpack/adaptor/raw.hpp @@ -18,12 +18,15 @@ #ifndef MSGPACK_TYPE_RAW_HPP #define MSGPACK_TYPE_RAW_HPP -#include "msgpack/object.hpp" +#include "msgpack/versioning.hpp" +#include "msgpack/object_fwd.hpp" #include #include namespace msgpack { +MSGPACK_API_VERSION_NAMESPACE(v1) { + namespace type { struct raw_ref { @@ -88,6 +91,8 @@ inline void operator<< (object::with_zone& o, const type::raw_ref& v) { static_cast(o) << v; } +} // MSGPACK_API_VERSION_NAMESPACE(v1) + } // namespace msgpack -#endif /* msgpack/type/raw.hpp */ +#endif // MSGPACK_TYPE_RAW_HPP diff --git a/include/msgpack/adaptor/raw_fwd.hpp b/include/msgpack/adaptor/raw_fwd.hpp new file mode 100644 index 00000000..26f83434 --- /dev/null +++ b/include/msgpack/adaptor/raw_fwd.hpp @@ -0,0 +1,50 @@ +// +// MessagePack for C++ static resolution routine +// +// Copyright (C) 2008-2009 FURUHASHI Sadayuki +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#ifndef MSGPACK_TYPE_RAW_FWD_HPP +#define MSGPACK_TYPE_RAW_FWD_HPP + +#include "msgpack/versioning.hpp" +#include "msgpack/object_fwd.hpp" +#include +#include + +namespace msgpack { + +MSGPACK_API_VERSION_NAMESPACE(v1) { + +namespace type { + +struct raw_ref; + +} // namespace type + + +object const& operator>> (object const& o, type::raw_ref& v); + +template +packer& operator<< (packer& o, const type::raw_ref& v); + +void operator<< (object& o, const type::raw_ref& v); + +void operator<< (object::with_zone& o, const type::raw_ref& v); + +} // MSGPACK_API_VERSION_NAMESPACE(v1) + +} // namespace msgpack + +#endif // MSGPACK_TYPE_RAW_FWD_HPP diff --git a/include/msgpack/adaptor/set.hpp b/include/msgpack/adaptor/set.hpp index fa2b5657..427b52fc 100644 --- a/include/msgpack/adaptor/set.hpp +++ b/include/msgpack/adaptor/set.hpp @@ -18,11 +18,14 @@ #ifndef MSGPACK_TYPE_SET_HPP #define MSGPACK_TYPE_SET_HPP -#include "msgpack/object.hpp" +#include "msgpack/versioning.hpp" +#include "msgpack/object_fwd.hpp" + #include namespace msgpack { +MSGPACK_API_VERSION_NAMESPACE(v1) { template inline object const& operator>> (object const& o, std::set& v) @@ -119,7 +122,8 @@ inline void operator<< (object::with_zone& o, const std::multiset& v) } } +} // MSGPACK_API_VERSION_NAMESPACE(v1) } // namespace msgpack -#endif /* msgpack/type/set.hpp */ +#endif // MSGPACK_TYPE_SET_HPP diff --git a/include/msgpack/adaptor/set_fwd.hpp b/include/msgpack/adaptor/set_fwd.hpp new file mode 100644 index 00000000..ae5712f8 --- /dev/null +++ b/include/msgpack/adaptor/set_fwd.hpp @@ -0,0 +1,52 @@ +// +// MessagePack for C++ static resolution routine +// +// Copyright (C) 2008-2014 FURUHASHI Sadayuki and KONDO Takatoshi +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#ifndef MSGPACK_TYPE_SET_FWD_HPP +#define MSGPACK_TYPE_SET_FWD_HPP + +#include "msgpack/versioning.hpp" +#include "msgpack/object_fwd.hpp" + +#include + +namespace msgpack { + +MSGPACK_API_VERSION_NAMESPACE(v1) { + +template +object const& operator>> (object const& o, std::set& v); + +template +packer& operator<< (packer& o, const std::set& v); + +template +void operator<< (object::with_zone& o, const std::set& v); + +template +object const& operator>> (object const& o, std::multiset& v); + +template +packer& operator<< (packer& o, const std::multiset& v); + +template +void operator<< (object::with_zone& o, const std::multiset& v); + +} // MSGPACK_API_VERSION_NAMESPACE(v1) + +} // namespace msgpack + +#endif // MSGPACK_TYPE_SET_FWD_HPP diff --git a/include/msgpack/adaptor/string.hpp b/include/msgpack/adaptor/string.hpp index a1ea2f8c..05c2867f 100644 --- a/include/msgpack/adaptor/string.hpp +++ b/include/msgpack/adaptor/string.hpp @@ -18,11 +18,13 @@ #ifndef MSGPACK_TYPE_STRING_HPP #define MSGPACK_TYPE_STRING_HPP -#include "msgpack/object.hpp" +#include "msgpack/versioning.hpp" +#include "msgpack/object_fwd.hpp" #include namespace msgpack { +MSGPACK_API_VERSION_NAMESPACE(v1) { inline object const& operator>> (object const& o, std::string& v) { @@ -64,7 +66,8 @@ inline void operator<< (object& o, const std::string& v) o.via.str.size = static_cast(v.size()); } +} // MSGPACK_API_VERSION_NAMESPACE(v1) } // namespace msgpack -#endif /* msgpack/type/string.hpp */ +#endif // MSGPACK_TYPE_STRING_HPP diff --git a/include/msgpack/adaptor/string_fwd.hpp b/include/msgpack/adaptor/string_fwd.hpp new file mode 100644 index 00000000..471654e6 --- /dev/null +++ b/include/msgpack/adaptor/string_fwd.hpp @@ -0,0 +1,42 @@ +// +// MessagePack for C++ static resolution routine +// +// Copyright (C) 2008-2014 FURUHASHI Sadayuki and KONDO Takatoshi +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#ifndef MSGPACK_TYPE_STRING_FWD_HPP +#define MSGPACK_TYPE_STRING_FWD_HPP + +#include "msgpack/versioning.hpp" +#include "msgpack/object_fwd.hpp" +#include + +namespace msgpack { + +MSGPACK_API_VERSION_NAMESPACE(v1) { + +object const& operator>> (object const& o, std::string& v); + +template +packer& operator<< (packer& o, const std::string& v); + +void operator<< (object::with_zone& o, const std::string& v); + +void operator<< (object& o, const std::string& v); + +} // MSGPACK_API_VERSION_NAMESPACE(v1) + +} // namespace msgpack + +#endif // MSGPACK_TYPE_STRING_FWD_HPP diff --git a/include/msgpack/adaptor/tr1/unordered_map.hpp b/include/msgpack/adaptor/tr1/unordered_map.hpp index 7e6ea497..caf9f544 100644 --- a/include/msgpack/adaptor/tr1/unordered_map.hpp +++ b/include/msgpack/adaptor/tr1/unordered_map.hpp @@ -18,7 +18,8 @@ #ifndef MSGPACK_TYPE_TR1_UNORDERED_MAP_HPP #define MSGPACK_TYPE_TR1_UNORDERED_MAP_HPP -#include "msgpack/object.hpp" +#include "msgpack/versioning.hpp" +#include "msgpack/object_fwd.hpp" #if defined(_LIBCPP_VERSION) || (_MSC_VER >= 1700) @@ -42,6 +43,7 @@ namespace msgpack { +MSGPACK_API_VERSION_NAMESPACE(v1) { template inline object const& operator>> (object const& o, MSGPACK_STD_TR1::unordered_map& v) @@ -145,9 +147,10 @@ inline void operator<< (object::with_zone& o, const MSGPACK_STD_TR1::unordered_m } } +} // MSGPACK_API_VERSION_NAMESPACE(v1) } // namespace msgpack #undef MSGPACK_STD_TR1 -#endif /* msgpack/type/map.hpp */ +#endif // MSGPACK_TYPE_TR1_UNORDERED_MAP_HPP diff --git a/include/msgpack/adaptor/tr1/unordered_map_fwd.hpp b/include/msgpack/adaptor/tr1/unordered_map_fwd.hpp new file mode 100644 index 00000000..99801e96 --- /dev/null +++ b/include/msgpack/adaptor/tr1/unordered_map_fwd.hpp @@ -0,0 +1,72 @@ +// +// MessagePack for C++ static resolution routine +// +// Copyright (C) 2008-2014 FURUHASHI Sadayuki and KONDO Takatoshi +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#ifndef MSGPACK_TYPE_TR1_UNORDERED_MAP_FWD_HPP +#define MSGPACK_TYPE_TR1_UNORDERED_MAP_FWD_HPP + +#include "msgpack/versioning.hpp" +#include "msgpack/object_fwd.hpp" + +#if defined(_LIBCPP_VERSION) || (_MSC_VER >= 1700) + +#define MSGPACK_HAS_STD_UNOURDERED_MAP +#include +#define MSGPACK_STD_TR1 std + +#else // defined(_LIBCPP_VERSION) || (_MSC_VER >= 1700) + +#if __GNUC__ >= 4 + +#define MSGPACK_HAS_STD_TR1_UNOURDERED_MAP + +#include +#define MSGPACK_STD_TR1 std::tr1 + +#endif // __GNUC__ >= 4 + +#endif // defined(_LIBCPP_VERSION) || (_MSC_VER >= 1700) + + +namespace msgpack { + +MSGPACK_API_VERSION_NAMESPACE(v1) { + +template +object const& operator>> (object const& o, MSGPACK_STD_TR1::unordered_map& v); + +template +packer& operator<< (packer& o, const MSGPACK_STD_TR1::unordered_map& v); + +template +void operator<< (object::with_zone& o, const MSGPACK_STD_TR1::unordered_map& v); + +template +object const& operator>> (object const& o, MSGPACK_STD_TR1::unordered_multimap& v); + +template +packer& operator<< (packer& o, const MSGPACK_STD_TR1::unordered_multimap& v); + +template +void operator<< (object::with_zone& o, const MSGPACK_STD_TR1::unordered_multimap& v); + +} // MSGPACK_API_VERSION_NAMESPACE(v1) + +} // namespace msgpack + +#undef MSGPACK_STD_TR1 + +#endif // MSGPACK_TYPE_TR1_UNORDERED_MAP_FWD_HPP diff --git a/include/msgpack/adaptor/tr1/unordered_set.hpp b/include/msgpack/adaptor/tr1/unordered_set.hpp index 384e2fac..9db2825c 100644 --- a/include/msgpack/adaptor/tr1/unordered_set.hpp +++ b/include/msgpack/adaptor/tr1/unordered_set.hpp @@ -18,7 +18,8 @@ #ifndef MSGPACK_TYPE_TR1_UNORDERED_SET_HPP #define MSGPACK_TYPE_TR1_UNORDERED_SET_HPP -#include "msgpack/object.hpp" +#include "msgpack/versioning.hpp" +#include "msgpack/object_fwd.hpp" #if defined(_LIBCPP_VERSION) || (_MSC_VER >= 1700) @@ -41,6 +42,7 @@ namespace msgpack { +MSGPACK_API_VERSION_NAMESPACE(v1) { template inline object const& operator>> (object const& o, MSGPACK_STD_TR1::unordered_set& v) @@ -137,9 +139,10 @@ inline void operator<< (object::with_zone& o, const MSGPACK_STD_TR1::unordered_m } } +} // MSGPACK_API_VERSION_NAMESPACE(v1) } // namespace msgpack #undef MSGPACK_STD_TR1 -#endif /* msgpack/type/set.hpp */ +#endif // MSGPACK_TYPE_TR1_UNORDERED_SET_HPP diff --git a/include/msgpack/adaptor/tr1/unordered_set_fwd.hpp b/include/msgpack/adaptor/tr1/unordered_set_fwd.hpp new file mode 100644 index 00000000..f5e9e648 --- /dev/null +++ b/include/msgpack/adaptor/tr1/unordered_set_fwd.hpp @@ -0,0 +1,71 @@ +// +// MessagePack for C++ static resolution routine +// +// Copyright (C) 2008-2009 FURUHASHI Sadayuki +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#ifndef MSGPACK_TYPE_TR1_UNORDERED_SET_FWD_HPP +#define MSGPACK_TYPE_TR1_UNORDERED_SET_FWD_HPP + +#include "msgpack/versioning.hpp" +#include "msgpack/object_fwd.hpp" + +#if defined(_LIBCPP_VERSION) || (_MSC_VER >= 1700) + +#define MSGPACK_HAS_STD_UNOURDERED_SET +#include +#define MSGPACK_STD_TR1 std + +#else // defined(_LIBCPP_VERSION) || (_MSC_VER >= 1700) + +#if __GNUC__ >= 4 + +#define MSGPACK_HAS_STD_TR1_UNOURDERED_SET + +#include +#define MSGPACK_STD_TR1 std::tr1 + +#endif // __GNUC__ >= 4 + +#endif // defined(_LIBCPP_VERSION) || (_MSC_VER >= 1700) + +namespace msgpack { + +MSGPACK_API_VERSION_NAMESPACE(v1) { + +template +object const& operator>> (object const& o, MSGPACK_STD_TR1::unordered_set& v); + +template +packer& operator<< (packer& o, const MSGPACK_STD_TR1::unordered_set& v); + +template +void operator<< (object::with_zone& o, const MSGPACK_STD_TR1::unordered_set& v); + +template +object const& operator>> (object const& o, MSGPACK_STD_TR1::unordered_multiset& v); + +template +packer& operator<< (packer& o, const MSGPACK_STD_TR1::unordered_multiset& v); + +template +void operator<< (object::with_zone& o, const MSGPACK_STD_TR1::unordered_multiset& v); + +} // MSGPACK_API_VERSION_NAMESPACE(v1) + +} // namespace msgpack + +#undef MSGPACK_STD_TR1 + +#endif // MSGPACK_TYPE_TR1_UNORDERED_SET_FWD_HPP diff --git a/include/msgpack/adaptor/vector.hpp b/include/msgpack/adaptor/vector.hpp index 73856896..fe643117 100644 --- a/include/msgpack/adaptor/vector.hpp +++ b/include/msgpack/adaptor/vector.hpp @@ -18,11 +18,13 @@ #ifndef MSGPACK_TYPE_VECTOR_HPP #define MSGPACK_TYPE_VECTOR_HPP -#include "msgpack/object.hpp" +#include "msgpack/versioning.hpp" +#include "msgpack/object_fwd.hpp" #include namespace msgpack { +MSGPACK_API_VERSION_NAMESPACE(v1) { template inline object const& operator>> (object const& o, std::vector& v) @@ -74,7 +76,8 @@ inline void operator<< (object::with_zone& o, const std::vector& v) } } +} // MSGPACK_API_VERSION_NAMESPACE(v1) } // namespace msgpack -#endif /* msgpack/type/vector.hpp */ +#endif // MSGPACK_TYPE_VECTOR_HPP diff --git a/include/msgpack/adaptor/vector_char.hpp b/include/msgpack/adaptor/vector_char.hpp index d87081d0..1ea6c93c 100644 --- a/include/msgpack/adaptor/vector_char.hpp +++ b/include/msgpack/adaptor/vector_char.hpp @@ -18,11 +18,14 @@ #ifndef MSGPACK_TYPE_VECTOR_CHAR_HPP #define MSGPACK_TYPE_VECTOR_CHAR_HPP -#include "msgpack/object.hpp" +#include "msgpack/versioning.hpp" +#include "msgpack/object_fwd.hpp" #include namespace msgpack { +MSGPACK_API_VERSION_NAMESPACE(v1) { + inline object const& operator>> (object const& o, std::vector& v) { switch (o.type) { @@ -66,6 +69,8 @@ inline void operator<< (object::with_zone& o, const std::vector& v) std::memcpy(ptr, v.data(), v.size()); } +} // MSGPACK_API_VERSION_NAMESPACE(v1) + } // namespace msgpack #endif // MSGPACK_TYPE_VECTOR_CHAR_HPP diff --git a/include/msgpack/adaptor/vector_char_fwd.hpp b/include/msgpack/adaptor/vector_char_fwd.hpp new file mode 100644 index 00000000..0d668efd --- /dev/null +++ b/include/msgpack/adaptor/vector_char_fwd.hpp @@ -0,0 +1,42 @@ +// +// MessagePack for C++ static resolution routine +// +// Copyright (C) 2014 KONDO Takatoshi +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#ifndef MSGPACK_TYPE_VECTOR_CHAR_FWD_HPP +#define MSGPACK_TYPE_VECTOR_CHAR_FWD_HPP + +#include "msgpack/versioning.hpp" +#include "msgpack/object_fwd.hpp" +#include + +namespace msgpack { + +MSGPACK_API_VERSION_NAMESPACE(v1) { + +object const& operator>> (object const& o, std::vector& v); + +template +packer& operator<< (packer& o, const std::vector& v); + +void operator<< (object& o, const std::vector& v); + +void operator<< (object::with_zone& o, const std::vector& v); + +} // MSGPACK_API_VERSION_NAMESPACE(v1) + +} // namespace msgpack + +#endif // MSGPACK_TYPE_VECTOR_CHAR_FWD_HPP diff --git a/include/msgpack/adaptor/vector_fwd.hpp b/include/msgpack/adaptor/vector_fwd.hpp new file mode 100644 index 00000000..1e144018 --- /dev/null +++ b/include/msgpack/adaptor/vector_fwd.hpp @@ -0,0 +1,42 @@ +// +// MessagePack for C++ static resolution routine +// +// Copyright (C) 2008-2009 FURUHASHI Sadayuki +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#ifndef MSGPACK_TYPE_VECTOR_FWD_HPP +#define MSGPACK_TYPE_VECTOR_FWD_HPP + +#include "msgpack/versioning.hpp" +#include "msgpack/object_fwd.hpp" +#include + +namespace msgpack { + +MSGPACK_API_VERSION_NAMESPACE(v1) { + +template +object const& operator>> (object const& o, std::vector& v); + +template +packer& operator<< (packer& o, const std::vector& v); + +template +void operator<< (object::with_zone& o, const std::vector& v); + +} // MSGPACK_API_VERSION_NAMESPACE(v1) + +} // namespace msgpack + +#endif // MSGPACK_TYPE_VECTOR_FWD_HPP diff --git a/include/msgpack/cpp_config.hpp b/include/msgpack/cpp_config.hpp index 72be9817..be00f6ef 100644 --- a/include/msgpack/cpp_config.hpp +++ b/include/msgpack/cpp_config.hpp @@ -18,6 +18,8 @@ #ifndef MSGPACK_CPP_CONFIG_HPP #define MSGPACK_CPP_CONFIG_HPP +#include "msgpack/versioning.hpp" + #if !defined(MSGPACK_USE_CPP03) // If MSVC would support C++11 completely, // then 'defined(_MSC_VER)' would replace with @@ -40,6 +42,8 @@ namespace msgpack { +MSGPACK_API_VERSION_NAMESPACE(v1) { + template struct unique_ptr : std::auto_ptr { explicit unique_ptr(T* p = 0) throw() : std::auto_ptr(p) {} @@ -69,7 +73,9 @@ template struct enable_if { }; -} // msgpack +} // MSGPACK_API_VERSION_NAMESPACE(v1) + +} // namespace msgpack #else // __cplusplus < 201103 @@ -78,6 +84,8 @@ struct enable_if { #include namespace msgpack { +MSGPACK_API_VERSION_NAMESPACE(v1) { + // unique_ptr using std::unique_ptr; // using std::make_unique; // since C++14 @@ -88,7 +96,8 @@ namespace msgpack { using std::swap; using std::enable_if; -} // msgpack +} // MSGPACK_API_VERSION_NAMESPACE(v1) +} // namespace msgpack #endif // __cplusplus < 201103 diff --git a/include/msgpack/detail/cpp03_zone.hpp b/include/msgpack/detail/cpp03_zone.hpp index 989398da..8d202232 100644 --- a/include/msgpack/detail/cpp03_zone.hpp +++ b/include/msgpack/detail/cpp03_zone.hpp @@ -22,7 +22,7 @@ #include #include -#include "msgpack/cpp_config.hpp" +#include "msgpack/versioning.hpp" #ifndef MSGPACK_ZONE_CHUNK_SIZE #define MSGPACK_ZONE_CHUNK_SIZE 8192 @@ -35,6 +35,8 @@ namespace msgpack { +MSGPACK_API_VERSION_NAMESPACE(v1) { + class zone { struct finalizer { finalizer(void (*func)(void*), void* data):m_func(func), m_data(data) {} @@ -631,6 +633,8 @@ T* zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, } +} // MSGPACK_API_VERSION_NAMESPACE(v1) + } // namespace msgpack #endif // MSGPACK_CPP03_ZONE_HPP diff --git a/include/msgpack/detail/cpp11_zone.hpp b/include/msgpack/detail/cpp11_zone.hpp index f768f008..f3ec210b 100644 --- a/include/msgpack/detail/cpp11_zone.hpp +++ b/include/msgpack/detail/cpp11_zone.hpp @@ -18,6 +18,8 @@ #ifndef MSGPACK_CPP11_ZONE_HPP #define MSGPACK_CPP11_ZONE_HPP +#include "msgpack/versioning.hpp" + #include #include #include @@ -34,6 +36,8 @@ namespace msgpack { +MSGPACK_API_VERSION_NAMESPACE(v1) { + class zone { private: struct finalizer { @@ -341,6 +345,8 @@ T* zone::allocate(Args... args) } } +} // MSGPACK_API_VERSION_NAMESPACE(v1) + } // namespace msgpack #endif // MSGPACK_CPP11_ZONE_HPP diff --git a/include/msgpack/fbuffer.hpp b/include/msgpack/fbuffer.hpp index 5d974d6f..39bb4089 100644 --- a/include/msgpack/fbuffer.hpp +++ b/include/msgpack/fbuffer.hpp @@ -18,11 +18,14 @@ #ifndef MSGPACK_FBUFFER_HPP__ #define MSGPACK_FBUFFER_HPP__ +#include "msgpack/versioning.hpp" + #include #include namespace msgpack { +MSGPACK_API_VERSION_NAMESPACE(v1) { class fbuffer { public: @@ -49,8 +52,8 @@ private: FILE* m_file; }; +} // MSGPACK_API_VERSION_NAMESPACE(v1) } // namespace msgpack #endif /* msgpack/fbuffer.hpp */ - diff --git a/include/msgpack/object.hpp b/include/msgpack/object.hpp index f060450b..b6df9fa5 100644 --- a/include/msgpack/object.hpp +++ b/include/msgpack/object.hpp @@ -1,7 +1,7 @@ // // MessagePack for C++ static resolution routine // -// Copyright (C) 2008-2010 FURUHASHI Sadayuki +// Copyright (C) 2008-2014 FURUHASHI Sadayuki and KONDO Takatoshi // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -18,9 +18,37 @@ #ifndef MSGPACK_OBJECT_HPP #define MSGPACK_OBJECT_HPP -#include "object.h" -#include "pack.hpp" -#include "zone.hpp" +#include "msgpack/versioning.hpp" +#include "msgpack/object_fwd.hpp" +#include "msgpack/pack.hpp" +#include "msgpack/zone.hpp" +#include "msgpack/adaptor/int_fwd.hpp" +#include "msgpack/adaptor/bool_fwd.hpp" +#include "msgpack/adaptor/char_ptr_fwd.hpp" +#include "msgpack/adaptor/deque_fwd.hpp" +#include "msgpack/adaptor/fixint_fwd.hpp" +#include "msgpack/adaptor/float_fwd.hpp" +#include "msgpack/adaptor/int_fwd.hpp" +#include "msgpack/adaptor/list_fwd.hpp" +#include "msgpack/adaptor/map_fwd.hpp" +#include "msgpack/adaptor/msgpack_tuple_fwd.hpp" +#include "msgpack/adaptor/nil_fwd.hpp" +#include "msgpack/adaptor/pair_fwd.hpp" +#include "msgpack/adaptor/raw_fwd.hpp" +#include "msgpack/adaptor/set_fwd.hpp" +#include "msgpack/adaptor/string_fwd.hpp" +#include "msgpack/adaptor/vector_fwd.hpp" +#include "msgpack/adaptor/vector_char_fwd.hpp" +#include "msgpack/adaptor/tr1/unordered_map_fwd.hpp" +#include "msgpack/adaptor/tr1/unordered_set_fwd.hpp" + +#if !defined(MSGPACK_USE_CPP03) +#include "adaptor/cpp11/array_fwd.hpp" +#include "adaptor/cpp11/array_char_fwd.hpp" +#include "adaptor/cpp11/forward_list_fwd.hpp" +#include "adaptor/cpp11/tuple_fwd.hpp" +#endif // !defined(MSGPACK_USE_CPP03) + #include #include #include @@ -29,114 +57,7 @@ namespace msgpack { - -class type_error : public std::bad_cast { }; - - -namespace type { - enum object_type { - NIL = MSGPACK_OBJECT_NIL, - BOOLEAN = MSGPACK_OBJECT_BOOLEAN, - POSITIVE_INTEGER = MSGPACK_OBJECT_POSITIVE_INTEGER, - NEGATIVE_INTEGER = MSGPACK_OBJECT_NEGATIVE_INTEGER, - DOUBLE = MSGPACK_OBJECT_DOUBLE, - STR = MSGPACK_OBJECT_STR, - BIN = MSGPACK_OBJECT_BIN, - ARRAY = MSGPACK_OBJECT_ARRAY, - MAP = MSGPACK_OBJECT_MAP, - EXT = MSGPACK_OBJECT_EXT - }; -} - - -struct object; -struct object_kv; - -struct object_array { - uint32_t size; - object* ptr; -}; - -struct object_map { - uint32_t size; - object_kv* ptr; -}; - -struct object_str { - uint32_t size; - const char* ptr; -}; - -struct object_bin { - uint32_t size; - const char* ptr; -}; - -struct object_ext { - int8_t type() const { return ptr[0]; } - const char* data() const { return &ptr[1]; } - uint32_t size; - const char* ptr; -}; - -struct object { - union union_type { - bool boolean; - uint64_t u64; - int64_t i64; - double dec; - object_array array; - object_map map; - object_str str; - object_bin bin; - object_ext ext; - }; - - type::object_type type; - union_type via; - - bool is_nil() const { return type == type::NIL; } - - template - T as() const; - - template - void convert(T& v) const; - template - void convert(T* v) const; - - object(); - - object(msgpack_object o); - - template - explicit object(const T& v); - - template - object(const T& v, zone& z); - - // obsolete - template - object(const T& v, zone* z); - - template - object& operator=(const T& v); - - operator msgpack_object() const; - - struct with_zone; - -private: - struct implicit_type; - -public: - implicit_type convert() const; -}; - -struct object_kv { - object key; - object val; -}; +MSGPACK_API_VERSION_NAMESPACE(v1) { struct object::with_zone : object { with_zone(msgpack::zone& zone) : zone(zone) { } @@ -156,6 +77,48 @@ private: object const& obj; }; +inline object const& operator>> (object const& o, object& v) +{ + v = o; + return o; +} + +template +inline object const& operator>> (object const& o, T& v) +{ + // If you get a error 'class your_class has no member named 'msgpack_unpack', + // check the following: + // 1. The class your_class should have MSGPACK_DEFINE macro or + // + // 2. The class your_class should have the following operator declaration and + // definition: + // inline object const& operator>> (object const& o, std::string& v) + // + // See 3. + // + // 3. #include "msgpack.hpp" too early. + // Replace msgpack.hpp with msgpack_fwd.hpp, then, + // place operator declarations as follows: + // + // namespace msgpack { + // MSGPACK_API_VERSION_NAMESPACE(MSGPACK_DEFAULT_API_NS) { + // object const& operator>> (object const& o, std::string& v); + // } + // } + // + // then, #include "msgpack.hpp", finally place the operator definitions as follows: + // + // namespace msgpack { + // MSGPACK_API_VERSION_NAMESPACE(MSGPACK_DEFAULT_API_NS) { + // object const& operator>> (object const& o, std::string& v) { + // // converting operations here + // } + // } // MSGPACK_API_VERSION_NAMESPACE(MSGPACK_DEFAULT_API_NS) + // } // namespace msgpack + // + v.msgpack_unpack(o.convert()); + return o; +} // obsolete template @@ -170,42 +133,55 @@ public: template void msgpack_pack(Packer& o) const { - o << static_cast(*this); + msgpack::operator<<(o, static_cast(*this)); } void msgpack_unpack(object const& o) { - o >> static_cast(*this); + msgpack::operator>>(o, static_cast(*this)); } }; - -template -template -inline packer& packer::pack(const T& v) -{ - *this << v; - return *this; -} - -inline object const& operator>> (object const& o, object& v) -{ - v = o; - return o; -} - -// convert operator -template -inline object const& operator>> (object const& o, T& v) -{ - v.msgpack_unpack(o.convert()); - return o; -} - namespace detail { template struct packer_serializer { static packer& pack(packer& o, const T& v) { + // If you get a error 'const class your_class has no member named 'msgpack_pack', + // check the following: + // 1. The class your_class should have MSGPACK_DEFINE macro or + // + // 2. The class your_class should have the following operator declaration and + // definition: + // + // namespace msgpack { + // MSGPACK_API_VERSION_NAMESPACE(MSGPACK_DEFAULT_API_NS) { + // template + // inline packer& operator<< (packer& o, const your_class& v) + // } // MSGPACK_API_VERSION_NAMESPACE(MSGPACK_DEFAULT_API_NS) + // } // namespace msgpack + // + // See 3. + // + // 3. #include "msgpack.hpp" too early. + // Replace msgpack.hpp with msgpack_fwd.hpp, then, + // place operator declarations as follows: + // + // namespace msgpack { + // MSGPACK_API_VERSION_NAMESPACE(MSGPACK_DEFAULT_API_NS) { + // template + // packer& operator<< (packer& o, const your_class& v); + // } // MSGPACK_API_VERSION_NAMESPACE(MSGPACK_DEFAULT_API_NS) + // } // namespace msgpack + // + // then, #include "msgpack.hpp", finally place the operator definitions as follows: + // + // template + // inline packer& operator<< (packer& o, const your_class& v) { + // // packing operation + // } + // } // MSGPACK_API_VERSION_NAMESPACE(MSGPACK_DEFAULT_API_NS) + // } // namespace msgpack + // v.msgpack_pack(o); return o; } @@ -226,6 +202,13 @@ inline void operator<< (object::with_zone& o, const T& v) v.msgpack_object(static_cast(&o), o.zone); } +template +template +inline packer& packer::pack(const T& v) +{ + msgpack::operator<<(*this, v); + return *this; +} inline bool operator==(const object& x, const object& y) { @@ -334,7 +317,7 @@ inline object::implicit_type object::convert() const template inline void object::convert(T& v) const { - *this >> v; + msgpack::operator>>(*this, v); } template @@ -360,7 +343,7 @@ inline object::object() template inline object::object(const T& v) { - *this << v; + msgpack::operator<<(*this, v); } template @@ -374,7 +357,7 @@ template object::object(const T& v, zone& z) { with_zone oz(z); - oz << v; + msgpack::operator<<(oz, v); type = oz.type; via = oz.via; } @@ -383,7 +366,7 @@ template object::object(const T& v, zone* z) { with_zone oz(*z); - oz << v; + msgpack::operator<<(oz, v); type = oz.type; via = oz.via; } @@ -433,7 +416,7 @@ inline void pack_copy(packer& o, T v) template -packer& operator<< (packer& o, const object& v) +inline packer& operator<< (packer& o, const object& v) { switch(v.type) { case type::NIL: @@ -480,7 +463,7 @@ packer& operator<< (packer& o, const object& v) for(object* p(v.via.array.ptr), * const pend(v.via.array.ptr + v.via.array.size); p < pend; ++p) { - o << *p; + msgpack::operator<<(o, *p); } return o; @@ -489,8 +472,8 @@ packer& operator<< (packer& o, const object& v) for(object_kv* p(v.via.map.ptr), * const pend(v.via.map.ptr + v.via.map.size); p < pend; ++p) { - o << p->key; - o << p->val; + msgpack::operator<<(o, p->key); + msgpack::operator<<(o, p->val); } return o; @@ -568,6 +551,8 @@ inline std::ostream& operator<< (std::ostream& s, const object& o) return s; } +} // MSGPACK_API_VERSION_NAMESPACE(v1) + } // namespace msgpack #include "msgpack/type.hpp" diff --git a/include/msgpack/object_fwd.hpp b/include/msgpack/object_fwd.hpp new file mode 100644 index 00000000..a8ae4422 --- /dev/null +++ b/include/msgpack/object_fwd.hpp @@ -0,0 +1,170 @@ +// +// MessagePack for C++ static resolution routine +// +// Copyright (C) 2008-2014 FURUHASHI Sadayuki and KONDO Takatoshi +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#ifndef MSGPACK_OBJECT_FWD_HPP +#define MSGPACK_OBJECT_FWD_HPP + +#include "msgpack/versioning.hpp" +#include "msgpack/zone.hpp" +#include "msgpack/object.h" + +#include + +namespace msgpack { + +MSGPACK_API_VERSION_NAMESPACE(v1) { + + +namespace type { + enum object_type { + NIL = MSGPACK_OBJECT_NIL, + BOOLEAN = MSGPACK_OBJECT_BOOLEAN, + POSITIVE_INTEGER = MSGPACK_OBJECT_POSITIVE_INTEGER, + NEGATIVE_INTEGER = MSGPACK_OBJECT_NEGATIVE_INTEGER, + DOUBLE = MSGPACK_OBJECT_DOUBLE, + STR = MSGPACK_OBJECT_STR, + BIN = MSGPACK_OBJECT_BIN, + ARRAY = MSGPACK_OBJECT_ARRAY, + MAP = MSGPACK_OBJECT_MAP, + EXT = MSGPACK_OBJECT_EXT + }; +} + + +struct object; +struct object_kv; + +struct object_array { + uint32_t size; + object* ptr; +}; + +struct object_map { + uint32_t size; + object_kv* ptr; +}; + +struct object_str { + uint32_t size; + const char* ptr; +}; + +struct object_bin { + uint32_t size; + const char* ptr; +}; + +struct object_ext { + int8_t type() const { return ptr[0]; } + const char* data() const { return &ptr[1]; } + uint32_t size; + const char* ptr; +}; + +struct object { + union union_type { + bool boolean; + uint64_t u64; + int64_t i64; + double dec; + object_array array; + object_map map; + object_str str; + object_bin bin; + object_ext ext; + }; + + type::object_type type; + union_type via; + + bool is_nil() const { return type == type::NIL; } + + template + T as() const; + + template + void convert(T& v) const; + template + void convert(T* v) const; + + object(); + + object(msgpack_object o); + + template + explicit object(const T& v); + + template + object(const T& v, zone& z); + + // obsolete + template + object(const T& v, zone* z); + + template + object& operator=(const T& v); + + operator msgpack_object() const; + + struct with_zone; + +private: + struct implicit_type; + +public: + implicit_type convert() const; +}; + +class type_error : public std::bad_cast { }; + +struct object_kv { + object key; + object val; +}; + +namespace detail { +template +struct packer_serializer; +} // namespace detail + +object const& operator>> (object const& o, object& v); + +template +object const& operator>> (object const& o, T& v); + +template +void operator<< (object::with_zone& o, const T& v); + + +template +class packer; + +template +packer& operator<< (packer& o, const object& v); + +template +packer& operator<< (packer& o, const T& v); + +template +void operator<< (object::with_zone& o, const T& v); + +} // MSGPACK_API_VERSION_NAMESPACE(v1) + +} // namespace msgpack + +#endif // MSGPACK_OBJECT_FWD_HPP diff --git a/include/msgpack/pack.hpp b/include/msgpack/pack.hpp index bfae2dd2..088d69a6 100644 --- a/include/msgpack/pack.hpp +++ b/include/msgpack/pack.hpp @@ -18,6 +18,8 @@ #ifndef MSGPACK_PACK_HPP #define MSGPACK_PACK_HPP +#include "msgpack/versioning.hpp" + #include #include #include @@ -26,6 +28,7 @@ namespace msgpack { +MSGPACK_API_VERSION_NAMESPACE(v1) { template class packer { @@ -1018,7 +1021,8 @@ inline void packer::pack_imp_int64(T d) } } +} // MSGPACK_API_VERSION_NAMESPACE(v1) + } // namespace msgpack #endif /* msgpack/pack.hpp */ - diff --git a/include/msgpack/sbuffer.hpp b/include/msgpack/sbuffer.hpp index 76f4be25..531f9f16 100644 --- a/include/msgpack/sbuffer.hpp +++ b/include/msgpack/sbuffer.hpp @@ -18,6 +18,8 @@ #ifndef MSGPACK_SBUFFER_HPP #define MSGPACK_SBUFFER_HPP +#include "msgpack/versioning.hpp" + #include #ifndef MSGPACK_SBUFFER_INIT_SIZE @@ -26,6 +28,7 @@ namespace msgpack { +MSGPACK_API_VERSION_NAMESPACE(v1) { class sbuffer { public: @@ -90,14 +93,14 @@ private: { size_t nsize = (m_alloc > 0) ? m_alloc * 2 : MSGPACK_SBUFFER_INIT_SIZE; - + while(nsize < m_size + len) { nsize *= 2; } - + void* tmp = ::realloc(m_data, nsize); if(!tmp) { throw std::bad_alloc(); } - + m_data = static_cast(tmp); m_alloc = nsize; } @@ -110,8 +113,8 @@ private: size_t m_alloc; }; +} // MSGPACK_API_VERSION_NAMESPACE(v1) } // namespace msgpack #endif /* msgpack/sbuffer.hpp */ - diff --git a/include/msgpack/unpack.hpp b/include/msgpack/unpack.hpp index 8dfe0973..28f1aea7 100644 --- a/include/msgpack/unpack.hpp +++ b/include/msgpack/unpack.hpp @@ -17,6 +17,8 @@ // #ifndef MSGPACK_UNPACK_HPP #define MSGPACK_UNPACK_HPP + +#include "msgpack/versioning.hpp" #include "object.hpp" #include "zone.hpp" #include "unpack_define.h" @@ -47,6 +49,8 @@ namespace msgpack { +MSGPACK_API_VERSION_NAMESPACE(v1) { + typedef bool (*unpack_reference_func)(type::object_type, std::size_t, void*); namespace detail { @@ -1456,6 +1460,8 @@ inline bool unpacker::default_reference_func(type::object_type /*type*/, std::si return true; } +} // MSGPACK_API_VERSION_NAMESPACE(v1) + } // namespace msgpack diff --git a/include/msgpack/versioning.hpp b/include/msgpack/versioning.hpp new file mode 100644 index 00000000..cb589ea3 --- /dev/null +++ b/include/msgpack/versioning.hpp @@ -0,0 +1,77 @@ +/* + * MessagePack for C++ version switcher + * + * Copyright (C) 2014 KONDO Takatoshi + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef MSGPACK_VERSIONING_HPP +#define MSGPACK_VERSIONING_HPP + +#if !defined(MSGPACK_DEFAULT_API_VERSION) +#define MSGPACK_DEFAULT_API_VERSION 1 +#endif + +#define MSGPACK_DEFAULT_API_NS MSGPACK_PP_CAT(v, MSGPACK_DEFAULT_API_VERSION) + +#if MSGPACK_DEFAULT_API_VERSION == 1 +#define MSGPACK_PP_ENABLE_NS_v1 () +//#elif MSGPACK_DEFAULT_API_VERSION == 2 +//#define MSGPACK_PP_ENABLE_NS_v2 () +#else +#error +#endif + +#define MSGPACK_PP_CAT(a, ...) MSGPACK_PP_PRIMITIVE_CAT(a, __VA_ARGS__) +#define MSGPACK_PP_PRIMITIVE_CAT(a, ...) a ## __VA_ARGS__ + +#define MSGPACK_PP_IIF(c) MSGPACK_PP_PRIMITIVE_CAT(MSGPACK_PP_IIF_, c) +#define MSGPACK_PP_IIF_0(t, ...) __VA_ARGS__ +#define MSGPACK_PP_IIF_1(t, ...) t + +#define MSGPACK_PP_PROBE(x) x, 1 + +#if defined(__MSC_VER) + +#define MSGPACK_PP_MSVC_VA_ARGS_WORKAROUND(define, args) define args +#define MSGPACK_PP_CHECK(...) MSGPACK_PP_MSVC_VA_ARGS_WORKAROUND(MSGPACK_PP_CHECK_N, (__VA_ARGS__, 0)) +#define MSGPACK_PP_CHECK_N(x, n, ...) n + +#else // defined(__MSC_VER) + +#define MSGPACK_PP_CHECK(...) MSGPACK_PP_CHECK_N(__VA_ARGS__, 0) +#define MSGPACK_PP_CHECK_N(x, n, ...) n + +#endif // defined(__MSC_VER) + + +#define MSGPACK_PP_NS_ENABLED_PROBE(ns) MSGPACK_PP_NS_ENABLED_PROBE_PROXY( MSGPACK_PP_ENABLE_NS_##ns ) +#define MSGPACK_PP_NS_ENABLED_PROBE_PROXY(...) MSGPACK_PP_NS_ENABLED_PROBE_PRIMIVIE(__VA_ARGS__) +#define MSGPACK_PP_NS_ENABLED_PROBE_PRIMIVIE(x) MSGPACK_PP_NS_ENABLED_PROBE_COMBINE_ x +#define MSGPACK_PP_NS_ENABLED_PROBE_COMBINE_(...) MSGPACK_PP_PROBE(~) + +#define MSGPACK_PP_IS_NS_ENABLED(ns) MSGPACK_PP_CHECK(MSGPACK_PP_NS_ENABLED_PROBE(ns)) + +#if __cplusplus < 201103 +#define MSGPACK_API_VERSION_NAMESPACE(ns) MSGPACK_PP_IIF(MSGPACK_PP_IS_NS_ENABLED(ns)) \ + (namespace ns{}; using namespace ns; namespace ns, \ + namespace ns) + +#else // __cplusplus < 201103 + +#define MSGPACK_API_VERSION_NAMESPACE(ns) MSGPACK_PP_IIF(MSGPACK_PP_IS_NS_ENABLED(ns)) \ + (inline namespace ns, namespace ns) + +#endif // __cplusplus < 201103 + +#endif // MSGPACK_VERSIONING_HPP diff --git a/include/msgpack/vrefbuffer.hpp b/include/msgpack/vrefbuffer.hpp index 4ce6cb45..28cd31ca 100644 --- a/include/msgpack/vrefbuffer.hpp +++ b/include/msgpack/vrefbuffer.hpp @@ -18,6 +18,8 @@ #ifndef MSGPACK_VREFBUFFER_HPP #define MSGPACK_VREFBUFFER_HPP +#include "msgpack/versioning.hpp" + #include #ifndef MSGPACK_VREFBUFFER_REF_SIZE @@ -39,6 +41,8 @@ struct iovec { namespace msgpack { +MSGPACK_API_VERSION_NAMESPACE(v1) { + namespace detail { // int64, uint64, double std::size_t const packer_max_buffer_size = 9; @@ -274,6 +278,7 @@ private: }; +} // MSGPACK_API_VERSION_NAMESPACE(v1) } // namespace msgpack diff --git a/include/msgpack/zbuffer.hpp b/include/msgpack/zbuffer.hpp index 6dd72341..43a9d77b 100644 --- a/include/msgpack/zbuffer.hpp +++ b/include/msgpack/zbuffer.hpp @@ -18,6 +18,8 @@ #ifndef MSGPACK_ZBUFFER_HPP #define MSGPACK_ZBUFFER_HPP +#include "msgpack/versioning.hpp" + #include #include @@ -31,6 +33,7 @@ namespace msgpack { +MSGPACK_API_VERSION_NAMESPACE(v1) { class zbuffer { public: @@ -155,8 +158,8 @@ private: size_t m_init_size; }; +} // MSGPACK_API_VERSION_NAMESPACE(v1) } // namespace msgpack #endif /* msgpack/zbuffer.hpp */ - diff --git a/include/msgpack_fwd.hpp b/include/msgpack_fwd.hpp new file mode 100644 index 00000000..f42ae169 --- /dev/null +++ b/include/msgpack_fwd.hpp @@ -0,0 +1,27 @@ +/* + * MessagePack for C++ version switcher + * + * Copyright (C) 2014 KONDO Takatoshi + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef MSGPACK_FWD_HPP +#define MSGPACK_FWD_HPP + +#include "msgpack/versioning.hpp" +#include "msgpack/zone.hpp" +#include "msgpack/object_fwd.hpp" +#include "msgpack/adaptor/define.hpp" +#include "msgpack/pack.hpp" + +#endif // MSGPACK_FWD_HPP diff --git a/preprocess b/preprocess index 5efab359..e25eff3f 100755 --- a/preprocess +++ b/preprocess @@ -13,5 +13,6 @@ preprocess() { } preprocess erb/cpp03_msgpack_tuple.hpp include/msgpack/adaptor/detail/cpp03_msgpack_tuple.hpp +preprocess erb/cpp03_msgpack_tuple_fwd.hpp include/msgpack/adaptor/detail/cpp03_msgpack_tuple_fwd.hpp preprocess erb/cpp03_define.hpp include/msgpack/adaptor/detail/cpp03_define.hpp preprocess erb/cpp03_zone.hpp include/msgpack/detail/cpp03_zone.hpp diff --git a/src/Makefile.am b/src/Makefile.am index 039aeacd..2c1ba1d7 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -53,42 +53,70 @@ nobase_include_HEADERS = \ if ENABLE_CXX nobase_include_HEADERS += \ ../include/msgpack.hpp \ + ../include/msgpack_fwd.hpp \ ../include/msgpack/adaptor/bool.hpp \ + ../include/msgpack/adaptor/bool_fwd.hpp \ ../include/msgpack/adaptor/char_ptr.hpp \ + ../include/msgpack/adaptor/char_ptr_fwd.hpp \ ../include/msgpack/adaptor/cpp11/array.hpp \ + ../include/msgpack/adaptor/cpp11/array_fwd.hpp \ ../include/msgpack/adaptor/cpp11/array_char.hpp \ + ../include/msgpack/adaptor/cpp11/array_char_fwd.hpp \ ../include/msgpack/adaptor/cpp11/forward_list.hpp \ + ../include/msgpack/adaptor/cpp11/forward_list_fwd.hpp \ ../include/msgpack/adaptor/cpp11/tuple.hpp \ + ../include/msgpack/adaptor/cpp11/tuple_fwd.hpp \ ../include/msgpack/adaptor/define.hpp \ ../include/msgpack/adaptor/deque.hpp \ + ../include/msgpack/adaptor/deque_fwd.hpp \ ../include/msgpack/adaptor/detail/cpp03_define.hpp \ ../include/msgpack/adaptor/detail/cpp03_msgpack_tuple.hpp \ + ../include/msgpack/adaptor/detail/cpp03_msgpack_tuple_fwd.hpp \ ../include/msgpack/adaptor/detail/cpp11_define.hpp \ ../include/msgpack/adaptor/detail/cpp11_msgpack_tuple.hpp \ + ../include/msgpack/adaptor/detail/cpp11_msgpack_tuple_fwd.hpp \ ../include/msgpack/adaptor/fixint.hpp \ + ../include/msgpack/adaptor/fixint_fwd.hpp \ ../include/msgpack/adaptor/float.hpp \ + ../include/msgpack/adaptor/float_fwd.hpp \ ../include/msgpack/adaptor/int.hpp \ + ../include/msgpack/adaptor/int_fwd.hpp \ ../include/msgpack/adaptor/list.hpp \ + ../include/msgpack/adaptor/list_fwd.hpp \ ../include/msgpack/adaptor/map.hpp \ + ../include/msgpack/adaptor/map_fwd.hpp \ ../include/msgpack/adaptor/msgpack_tuple.hpp \ + ../include/msgpack/adaptor/msgpack_tuple_fwd.hpp \ ../include/msgpack/adaptor/nil.hpp \ + ../include/msgpack/adaptor/nil_fwd.hpp \ ../include/msgpack/adaptor/pair.hpp \ + ../include/msgpack/adaptor/pair_fwd.hpp \ ../include/msgpack/adaptor/raw.hpp \ + ../include/msgpack/adaptor/raw_fwd.hpp \ ../include/msgpack/adaptor/set.hpp \ + ../include/msgpack/adaptor/set_fwd.hpp \ ../include/msgpack/adaptor/string.hpp \ + ../include/msgpack/adaptor/string_fwd.hpp \ ../include/msgpack/adaptor/tr1/unordered_map.hpp \ + ../include/msgpack/adaptor/tr1/unordered_map_fwd.hpp \ ../include/msgpack/adaptor/tr1/unordered_set.hpp \ + ../include/msgpack/adaptor/tr1/unordered_set_fwd.hpp \ ../include/msgpack/adaptor/vector.hpp \ + ../include/msgpack/adaptor/vector_fwd.hpp \ + ../include/msgpack/adaptor/vector_char.hpp \ + ../include/msgpack/adaptor/vector_char_fwd.hpp \ ../include/msgpack/cpp_config.hpp \ ../include/msgpack/detail/cpp03_zone.hpp \ ../include/msgpack/detail/cpp11_zone.hpp \ ../include/msgpack/fbuffer.hpp \ ../include/msgpack/object.hpp \ + ../include/msgpack/object_fwd.hpp \ ../include/msgpack/pack.hpp \ ../include/msgpack/sbuffer.hpp \ ../include/msgpack/type.hpp \ ../include/msgpack/unpack.hpp \ ../include/msgpack/version.hpp \ + ../include/msgpack/versioning.hpp \ ../include/msgpack/vrefbuffer.hpp \ ../include/msgpack/zbuffer.hpp \ ../include/msgpack/zone.hpp