/*

* 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© 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