diff options
| author | William A. Kennington III <wak@google.com> | 2018-10-04 14:45:07 -0700 |
|---|---|---|
| committer | William A. Kennington III <wak@google.com> | 2018-11-26 17:47:30 +0000 |
| commit | 90778b430290c9ec8c33fb77b03e2552d9dd6905 (patch) | |
| tree | c2cbf4ec03c266182a80890ec6483adf7366c1e5 | |
| parent | 6b4fb2969cd0c853ff6aa7f9bdd3ddaa0081c204 (diff) | |
| download | sdbusplus-90778b430290c9ec8c33fb77b03e2552d9dd6905.tar.gz sdbusplus-90778b430290c9ec8c33fb77b03e2552d9dd6905.zip | |
message: mapbox::util::variant -> std::variant
Now that we are utilizing c++17, we can move to using the standard
variant type instead of a custom third-party one.
Tested:
Ran through a unit test run.
Change-Id: Idd9854a6d958ea5a191e9a72d6116fd767dff4d3
Signed-off-by: William A. Kennington III <wak@google.com>
| -rw-r--r-- | Makefile.am | 2 | ||||
| -rw-r--r-- | mapbox/LICENSE | 25 | ||||
| -rw-r--r-- | mapbox/LICENSE_1_0.txt | 23 | ||||
| -rw-r--r-- | mapbox/README | 3 | ||||
| -rw-r--r-- | mapbox/recursive_wrapper.hpp | 146 | ||||
| -rw-r--r-- | mapbox/variant.hpp | 1153 | ||||
| -rw-r--r-- | sdbusplus/message/append.hpp | 2 | ||||
| -rw-r--r-- | sdbusplus/message/types.hpp | 4 |
8 files changed, 3 insertions, 1355 deletions
diff --git a/Makefile.am b/Makefile.am index ec552c3..0bab405 100644 --- a/Makefile.am +++ b/Makefile.am @@ -3,8 +3,6 @@ ACLOCAL_AMFLAGS = -Im4 if WANT_LIBSDBUSPLUS nobase_include_HEADERS = \ - mapbox/recursive_wrapper.hpp \ - mapbox/variant.hpp \ sdbusplus/asio/connection.hpp \ sdbusplus/asio/object_server.hpp \ sdbusplus/asio/detail/async_send_handler.hpp \ diff --git a/mapbox/LICENSE b/mapbox/LICENSE deleted file mode 100644 index 6c4ce40..0000000 --- a/mapbox/LICENSE +++ /dev/null @@ -1,25 +0,0 @@ -Copyright (c) MapBox -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -- Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. -- Redistributions in binary form must reproduce the above copyright notice, this - list of conditions and the following disclaimer in the documentation and/or - other materials provided with the distribution. -- Neither the name "MapBox" nor the names of its contributors may be - used to endorse or promote products derived from this software without - specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
\ No newline at end of file diff --git a/mapbox/LICENSE_1_0.txt b/mapbox/LICENSE_1_0.txt deleted file mode 100644 index 36b7cd9..0000000 --- a/mapbox/LICENSE_1_0.txt +++ /dev/null @@ -1,23 +0,0 @@ -Boost Software License - Version 1.0 - August 17th, 2003 - -Permission is hereby granted, free of charge, to any person or organization -obtaining a copy of the software and accompanying documentation covered by -this license (the "Software") to use, reproduce, display, distribute, -execute, and transmit the Software, and to prepare derivative works of the -Software, and to permit third-parties to whom the Software is furnished to -do so, all subject to the following: - -The copyright notices in the Software and this entire statement, including -the above license grant, this restriction and the following disclaimer, -must be included in all copies of the Software, in whole or in part, and -all derivative works of the Software, unless such copies or derivative -works are solely in the form of machine-executable object code generated by -a source language processor. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT -SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE -FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, -ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. diff --git a/mapbox/README b/mapbox/README deleted file mode 100644 index d54e938..0000000 --- a/mapbox/README +++ /dev/null @@ -1,3 +0,0 @@ -This implementation of variant came from http://github.com/mapbox/variant. As -soon as GCC7 with C++17 support is available, we should move to the -std::variant implementation instead. diff --git a/mapbox/recursive_wrapper.hpp b/mapbox/recursive_wrapper.hpp deleted file mode 100644 index c90a88c..0000000 --- a/mapbox/recursive_wrapper.hpp +++ /dev/null @@ -1,146 +0,0 @@ -#ifndef MAPBOX_UTIL_RECURSIVE_WRAPPER_HPP -#define MAPBOX_UTIL_RECURSIVE_WRAPPER_HPP - -// Based on variant/recursive_wrapper.hpp from boost. -// -// Original license: -// -// Copyright (c) 2002-2003 -// Eric Friedman, Itay Maman -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) - -#include <cassert> -#include <utility> - -namespace mapbox -{ -namespace util -{ - -template <typename T> -class recursive_wrapper -{ - - T* p_; - - void assign(T const& rhs) - { - this->get() = rhs; - } - - public: - using type = T; - - /** - * Default constructor default initializes the internally stored value. - * For POD types this means nothing is done and the storage is - * uninitialized. - * - * @throws std::bad_alloc if there is insufficient memory for an object - * of type T. - * @throws any exception thrown by the default constructur of T. - */ - recursive_wrapper() : p_(new T) - { - } - - ~recursive_wrapper() noexcept - { - delete p_; - } - - recursive_wrapper(recursive_wrapper const& operand) : - p_(new T(operand.get())) - { - } - - recursive_wrapper(T const& operand) : p_(new T(operand)) - { - } - - recursive_wrapper(recursive_wrapper&& operand) : - p_(new T(std::move(operand.get()))) - { - } - - recursive_wrapper(T&& operand) : p_(new T(std::move(operand))) - { - } - - inline recursive_wrapper& operator=(recursive_wrapper const& rhs) - { - assign(rhs.get()); - return *this; - } - - inline recursive_wrapper& operator=(T const& rhs) - { - assign(rhs); - return *this; - } - - inline void swap(recursive_wrapper& operand) noexcept - { - T* temp = operand.p_; - operand.p_ = p_; - p_ = temp; - } - - recursive_wrapper& operator=(recursive_wrapper&& rhs) noexcept - { - swap(rhs); - return *this; - } - - recursive_wrapper& operator=(T&& rhs) - { - get() = std::move(rhs); - return *this; - } - - T& get() - { - assert(p_); - return *get_pointer(); - } - - T const& get() const - { - assert(p_); - return *get_pointer(); - } - - T* get_pointer() - { - return p_; - } - - const T* get_pointer() const - { - return p_; - } - - operator T const&() const - { - return this->get(); - } - - operator T&() - { - return this->get(); - } - -}; // class recursive_wrapper - -template <typename T> -inline void swap(recursive_wrapper<T>& lhs, recursive_wrapper<T>& rhs) noexcept -{ - lhs.swap(rhs); -} -} // namespace util -} // namespace mapbox - -#endif // MAPBOX_UTIL_RECURSIVE_WRAPPER_HPP diff --git a/mapbox/variant.hpp b/mapbox/variant.hpp deleted file mode 100644 index ea980b3..0000000 --- a/mapbox/variant.hpp +++ /dev/null @@ -1,1153 +0,0 @@ -#ifndef MAPBOX_UTIL_VARIANT_HPP -#define MAPBOX_UTIL_VARIANT_HPP - -#include <cassert> -#include <cstddef> // size_t -#include <mapbox/recursive_wrapper.hpp> -#include <new> // operator new -#include <stdexcept> // runtime_error -#include <string> -#include <tuple> -#include <type_traits> -#include <typeinfo> -#include <utility> - -// clang-format off -// [[deprecated]] is only available in C++14, use this for the time being -#if __cplusplus <= 201103L -# ifdef __GNUC__ -# define MAPBOX_VARIANT_DEPRECATED __attribute__((deprecated)) -# elif defined(_MSC_VER) -# define MAPBOX_VARIANT_DEPRECATED __declspec(deprecated) -# else -# define MAPBOX_VARIANT_DEPRECATED -# endif -#else -# define MAPBOX_VARIANT_DEPRECATED [[deprecated]] -#endif - - -#ifdef _MSC_VER -// https://msdn.microsoft.com/en-us/library/bw1hbe6y.aspx -# ifdef NDEBUG -# define VARIANT_INLINE __forceinline -# else -# define VARIANT_INLINE //__declspec(noinline) -# endif -#else -# ifdef NDEBUG -# define VARIANT_INLINE //inline __attribute__((always_inline)) -# else -# define VARIANT_INLINE __attribute__((noinline)) -# endif -#endif -// clang-format on - -// Exceptions -#if defined(__EXCEPTIONS) || defined(_MSC_VER) -#define HAS_EXCEPTIONS -#endif - -#define VARIANT_MAJOR_VERSION 1 -#define VARIANT_MINOR_VERSION 1 -#define VARIANT_PATCH_VERSION 0 - -#define VARIANT_VERSION \ - (VARIANT_MAJOR_VERSION * 100000) + (VARIANT_MINOR_VERSION * 100) + \ - (VARIANT_PATCH_VERSION) - -namespace mapbox -{ -namespace util -{ - -// XXX This should derive from std::logic_error instead of std::runtime_error. -// See https://github.com/mapbox/variant/issues/48 for details. -class bad_variant_access : public std::runtime_error -{ - - public: - explicit bad_variant_access(const std::string& what_arg) : - runtime_error(what_arg) - { - } - - explicit bad_variant_access(const char* what_arg) : runtime_error(what_arg) - { - } - -}; // class bad_variant_access - -template <typename R = void> -struct MAPBOX_VARIANT_DEPRECATED static_visitor -{ - using result_type = R; - - protected: - static_visitor() - { - } - ~static_visitor() - { - } -}; - -namespace detail -{ - -static constexpr std::size_t invalid_value = std::size_t(-1); - -template <typename T, typename... Types> -struct direct_type; - -template <typename T, typename First, typename... Types> -struct direct_type<T, First, Types...> -{ - static constexpr std::size_t index = std::is_same<T, First>::value - ? sizeof...(Types) - : direct_type<T, Types...>::index; -}; - -template <typename T> -struct direct_type<T> -{ - static constexpr std::size_t index = invalid_value; -}; - -#if __cpp_lib_logical_traits >= 201510L - -using std::disjunction; - -#else - -template <typename...> -struct disjunction : std::false_type -{ -}; - -template <typename B1> -struct disjunction<B1> : B1 -{ -}; - -template <typename B1, typename B2> -struct disjunction<B1, B2> : std::conditional<B1::value, B1, B2>::type -{ -}; - -template <typename B1, typename... Bs> -struct disjunction<B1, Bs...> - : std::conditional<B1::value, B1, disjunction<Bs...>>::type -{ -}; - -#endif - -template <typename T, typename... Types> -struct convertible_type; - -template <typename T, typename First, typename... Types> -struct convertible_type<T, First, Types...> -{ - static constexpr std::size_t index = - std::is_convertible<T, First>::value - ? disjunction<std::is_convertible<T, Types>...>::value - ? invalid_value - : sizeof...(Types) - : convertible_type<T, Types...>::index; -}; - -template <typename T> -struct convertible_type<T> -{ - static constexpr std::size_t index = invalid_value; -}; - -template <typename T, typename... Types> -struct value_traits -{ - using value_type = typename std::remove_const< - typename std::remove_reference<T>::type>::type; - static constexpr std::size_t direct_index = - direct_type<value_type, Types...>::index; - static constexpr bool is_direct = direct_index != invalid_value; - static constexpr std::size_t index = - is_direct ? direct_index - : convertible_type<value_type, Types...>::index; - static constexpr bool is_valid = index != invalid_value; - static constexpr std::size_t tindex = - is_valid ? sizeof...(Types) - index : 0; - using target_type = - typename std::tuple_element<tindex, std::tuple<void, Types...>>::type; -}; - -template <typename T, typename R = void> -struct enable_if_type -{ - using type = R; -}; - -template <typename F, typename V, typename Enable = void> -struct result_of_unary_visit -{ - using type = typename std::result_of<F(V&)>::type; -}; - -template <typename F, typename V> -struct result_of_unary_visit< - F, V, typename enable_if_type<typename F::result_type>::type> -{ - using type = typename F::result_type; -}; - -template <typename F, typename V, typename Enable = void> -struct result_of_binary_visit -{ - using type = typename std::result_of<F(V&, V&)>::type; -}; - -template <typename F, typename V> -struct result_of_binary_visit< - F, V, typename enable_if_type<typename F::result_type>::type> -{ - using type = typename F::result_type; -}; - -template <std::size_t arg1, std::size_t... others> -struct static_max; - -template <std::size_t arg> -struct static_max<arg> -{ - static const std::size_t value = arg; -}; - -template <std::size_t arg1, std::size_t arg2, std::size_t... others> -struct static_max<arg1, arg2, others...> -{ - static const std::size_t value = arg1 >= arg2 - ? static_max<arg1, others...>::value - : static_max<arg2, others...>::value; -}; - -template <typename... Types> -struct variant_helper; - -template <typename T, typename... Types> -struct variant_helper<T, Types...> -{ - VARIANT_INLINE static void destroy(const std::size_t type_index, void* data) - { - if (type_index == sizeof...(Types)) - { - reinterpret_cast<T*>(data)->~T(); - } - else - { - variant_helper<Types...>::destroy(type_index, data); - } - } - - VARIANT_INLINE static void move(const std::size_t old_type_index, - void* old_value, void* new_value) - { - if (old_type_index == sizeof...(Types)) - { - new (new_value) T(std::move(*reinterpret_cast<T*>(old_value))); - } - else - { - variant_helper<Types...>::move(old_type_index, old_value, - new_value); - } - } - - VARIANT_INLINE static void copy(const std::size_t old_type_index, - const void* old_value, void* new_value) - { - if (old_type_index == sizeof...(Types)) - { - new (new_value) T(*reinterpret_cast<const T*>(old_value)); - } - else - { - variant_helper<Types...>::copy(old_type_index, old_value, - new_value); - } - } -}; - -template <> -struct variant_helper<> -{ - VARIANT_INLINE static void destroy(const std::size_t, void*) - { - } - VARIANT_INLINE static void move(const std::size_t, void*, void*) - { - } - VARIANT_INLINE static void copy(const std::size_t, const void*, void*) - { - } -}; - -template <typename T> -struct unwrapper -{ - static T const& apply_const(T const& obj) - { - return obj; - } - static T& apply(T& obj) - { - return obj; - } -}; - -template <typename T> -struct unwrapper<recursive_wrapper<T>> -{ - static auto apply_const(recursive_wrapper<T> const& obj) -> - typename recursive_wrapper<T>::type const& - { - return obj.get(); - } - static auto apply(recursive_wrapper<T>& obj) -> - typename recursive_wrapper<T>::type& - { - return obj.get(); - } -}; - -template <typename T> -struct unwrapper<std::reference_wrapper<T>> -{ - static auto apply_const(std::reference_wrapper<T> const& obj) -> - typename std::reference_wrapper<T>::type const& - { - return obj.get(); - } - static auto apply(std::reference_wrapper<T>& obj) -> - typename std::reference_wrapper<T>::type& - { - return obj.get(); - } -}; - -template <typename F, typename V, typename R, typename... Types> -struct dispatcher; - -template <typename F, typename V, typename R, typename T, typename... Types> -struct dispatcher<F, V, R, T, Types...> -{ - VARIANT_INLINE static R apply_const(V const& v, F&& f) - { - if (v.template is<T>()) - { - return f(unwrapper<T>::apply_const(v.template get_unchecked<T>())); - } - else - { - return dispatcher<F, V, R, Types...>::apply_const( - v, std::forward<F>(f)); - } - } - - VARIANT_INLINE static R apply(V& v, F&& f) - { - if (v.template is<T>()) - { - return f(unwrapper<T>::apply(v.template get_unchecked<T>())); - } - else - { - return dispatcher<F, V, R, Types...>::apply(v, std::forward<F>(f)); - } - } -}; - -template <typename F, typename V, typename R, typename T> -struct dispatcher<F, V, R, T> -{ - VARIANT_INLINE static R apply_const(V const& v, F&& f) - { - return f(unwrapper<T>::apply_const(v.template get_unchecked<T>())); - } - - VARIANT_INLINE static R apply(V& v, F&& f) - { - return f(unwrapper<T>::apply(v.template get_unchecked<T>())); - } -}; - -template <typename F, typename V, typename R, typename T, typename... Types> -struct binary_dispatcher_rhs; - -template <typename F, typename V, typename R, typename T0, typename T1, - typename... Types> -struct binary_dispatcher_rhs<F, V, R, T0, T1, Types...> -{ - VARIANT_INLINE static R apply_const(V const& lhs, V const& rhs, F&& f) - { - if (rhs.template is<T1>()) // call binary functor - { - return f( - unwrapper<T0>::apply_const(lhs.template get_unchecked<T0>()), - unwrapper<T1>::apply_const(rhs.template get_unchecked<T1>())); - } - else - { - return binary_dispatcher_rhs<F, V, R, T0, Types...>::apply_const( - lhs, rhs, std::forward<F>(f)); - } - } - - VARIANT_INLINE static R apply(V& lhs, V& rhs, F&& f) - { - if (rhs.template is<T1>()) // call binary functor - { - return f(unwrapper<T0>::apply(lhs.template get_unchecked<T0>()), - unwrapper<T1>::apply(rhs.template get_unchecked<T1>())); - } - else - { - return binary_dispatcher_rhs<F, V, R, T0, Types...>::apply( - lhs, rhs, std::forward<F>(f)); - } - } -}; - -template <typename F, typename V, typename R, typename T0, typename T1> -struct binary_dispatcher_rhs<F, V, R, T0, T1> -{ - VARIANT_INLINE static R apply_const(V const& lhs, V const& rhs, F&& f) - { - return f(unwrapper<T0>::apply_const(lhs.template get_unchecked<T0>()), - unwrapper<T1>::apply_const(rhs.template get_unchecked<T1>())); - } - - VARIANT_INLINE static R apply(V& lhs, V& rhs, F&& f) - { - return f(unwrapper<T0>::apply(lhs.template get_unchecked<T0>()), - unwrapper<T1>::apply(rhs.template get_unchecked<T1>())); - } -}; - -template <typename F, typename V, typename R, typename T, typename... Types> -struct binary_dispatcher_lhs; - -template <typename F, typename V, typename R, typename T0, typename T1, - typename... Types> -struct binary_dispatcher_lhs<F, V, R, T0, T1, Types...> -{ - VARIANT_INLINE static R apply_const(V const& lhs, V const& rhs, F&& f) - { - if (lhs.template is<T1>()) // call binary functor - { - return f( - unwrapper<T1>::apply_const(lhs.template get_unchecked<T1>()), - unwrapper<T0>::apply_const(rhs.template get_unchecked<T0>())); - } - else - { - return binary_dispatcher_lhs<F, V, R, T0, Types...>::apply_const( - lhs, rhs, std::forward<F>(f)); - } - } - - VARIANT_INLINE static R apply(V& lhs, V& rhs, F&& f) - { - if (lhs.template is<T1>()) // call binary functor - { - return f(unwrapper<T1>::apply(lhs.template get_unchecked<T1>()), - unwrapper<T0>::apply(rhs.template get_unchecked<T0>())); - } - else - { - return binary_dispatcher_lhs<F, V, R, T0, Types...>::apply( - lhs, rhs, std::forward<F>(f)); - } - } -}; - -template <typename F, typename V, typename R, typename T0, typename T1> -struct binary_dispatcher_lhs<F, V, R, T0, T1> -{ - VARIANT_INLINE static R apply_const(V const& lhs, V const& rhs, F&& f) - { - return f(unwrapper<T1>::apply_const(lhs.template get_unchecked<T1>()), - unwrapper<T0>::apply_const(rhs.template get_unchecked<T0>())); - } - - VARIANT_INLINE static R apply(V& lhs, V& rhs, F&& f) - { - return f(unwrapper<T1>::apply(lhs.template get_unchecked<T1>()), - unwrapper<T0>::apply(rhs.template get_unchecked<T0>())); - } -}; - -template <typename F, typename V, typename R, typename... Types> -struct binary_dispatcher; - -template <typename F, typename V, typename R, typename T, typename... Types> -struct binary_dispatcher<F, V, R, T, Types...> -{ - VARIANT_INLINE static R apply_const(V const& v0, V const& v1, F&& f) - { - if (v0.template is<T>()) - { - if (v1.template is<T>()) - { - return f( - unwrapper<T>::apply_const(v0.template get_unchecked<T>()), - unwrapper<T>::apply_const( - v1.template get_unchecked<T>())); // call binary functor - } - else - { - return binary_dispatcher_rhs<F, V, R, T, Types...>::apply_const( - v0, v1, std::forward<F>(f)); - } - } - else if (v1.template is<T>()) - { - return binary_dispatcher_lhs<F, V, R, T, Types...>::apply_const( - v0, v1, std::forward<F>(f)); - } - return binary_dispatcher<F, V, R, Types...>::apply_const( - v0, v1, std::forward<F>(f)); - } - - VARIANT_INLINE static R apply(V& v0, V& v1, F&& f) - { - if (v0.template is<T>()) - { - if (v1.template is<T>()) - { - return f( - unwrapper<T>::apply(v0.template get_unchecked<T>()), - unwrapper<T>::apply( - v1.template get_unchecked<T>())); // call binary functor - } - else - { - return binary_dispatcher_rhs<F, V, R, T, Types...>::apply( - v0, v1, std::forward<F>(f)); - } - } - else if (v1.template is<T>()) - { - return binary_dispatcher_lhs<F, V, R, T, Types...>::apply( - v0, v1, std::forward<F>(f)); - } - return binary_dispatcher<F, V, R, Types...>::apply(v0, v1, - std::forward<F>(f)); - } -}; - -template <typename F, typename V, typename R, typename T> -struct binary_dispatcher<F, V, R, T> -{ - VARIANT_INLINE static R apply_const(V const& v0, V const& v1, F&& f) - { - return f(unwrapper<T>::apply_const(v0.template get_unchecked<T>()), - unwrapper<T>::apply_const( - v1.template get_unchecked<T>())); // call binary functor - } - - VARIANT_INLINE static R apply(V& v0, V& v1, F&& f) - { - return f(unwrapper<T>::apply(v0.template get_unchecked<T>()), - unwrapper<T>::apply( - v1.template get_unchecked<T>())); // call binary functor - } -}; - -// comparator functors -struct equal_comp -{ - template <typename T> - bool operator()(T const& lhs, T const& rhs) const - { - return lhs == rhs; - } -}; - -struct less_comp -{ - template <typename T> - bool operator()(T const& lhs, T const& rhs) const - { - return lhs < rhs; - } -}; - -template <typename Variant, typename Comp> -class comparer -{ - public: - explicit comparer(Variant const& lhs) noexcept : lhs_(lhs) - { - } - comparer& operator=(comparer const&) = delete; - // visitor - template <typename T> - bool operator()(T const& rhs_content) const - { - T const& lhs_content = lhs_.template get_unchecked<T>(); - return Comp()(lhs_content, rhs_content); - } - - private: - Variant const& lhs_; -}; - -} // namespace detail - -struct no_init -{ -}; - -template <typename... Types> -class variant -{ - static_assert(sizeof...(Types) > 0, - "Template parameter type list of variant can not be empty"); - static_assert(!detail::disjunction<std::is_reference<Types>...>::value, - "Variant can not hold reference types. Maybe use " - "std::reference_wrapper?"); - - private: - static const std::size_t data_size = - detail::static_max<sizeof(Types)...>::value; - static const std::size_t data_align = - detail::static_max<alignof(Types)...>::value; - - using first_type = - typename std::tuple_element<0, std::tuple<Types...>>::type; - using data_type = - typename std::aligned_storage<data_size, data_align>::type; - using helper_type = detail::variant_helper<Types...>; - - std::size_t type_index; - data_type data; - - public: - VARIANT_INLINE variant() noexcept( - std::is_nothrow_default_constructible<first_type>::value) : - type_index(sizeof...(Types) - 1) - { - static_assert(std::is_default_constructible<first_type>::value, - "First type in variant must be default constructible to " - "allow default construction of variant"); - new (&data) first_type(); - } - - VARIANT_INLINE variant(no_init) noexcept : type_index(detail::invalid_value) - { - } - - // http://isocpp.org/blog/2012/11/universal-references-in-c11-scott-meyers - template <typename T, typename Traits = detail::value_traits<T, Types...>, - typename Enable = typename std::enable_if<Traits::is_valid>::type> - VARIANT_INLINE variant(T&& val) noexcept( - std::is_nothrow_constructible<typename Traits::target_type, - T&&>::value) : - type_index(Traits::index) - { - new (&data) typename Traits::target_type(std::forward<T>(val)); - } - - VARIANT_INLINE variant(variant<Types...> const& old) : - type_index(old.type_index) - { - helper_type::copy(old.type_index, &old.data, &data); - } - - VARIANT_INLINE variant(variant<Types...>&& old) noexcept( - std::is_nothrow_move_constructible<std::tuple<Types...>>::value) : - type_index(old.type_index) - { - helper_type::move(old.type_index, &old.data, &data); - } - - private: - VARIANT_INLINE void copy_assign(variant<Types...> const& rhs) - { - helper_type::destroy(type_index, &data); - type_index = detail::invalid_value; - helper_type::copy(rhs.type_index, &rhs.data, &data); - type_index = rhs.type_index; - } - - VARIANT_INLINE void move_assign(variant<Types...>&& rhs) - { - helper_type::destroy(type_index, &data); - type_index = detail::invalid_value; - helper_type::move(rhs.type_index, &rhs.data, &data); - type_index = rhs.type_index; - } - - public: - VARIANT_INLINE variant<Types...>& operator=(variant<Types...>&& other) - { - move_assign(std::move(other)); - return *this; - } - - VARIANT_INLINE variant<Types...>& operator=(variant<Types...> const& other) - { - copy_assign(other); - return *this; - } - - // conversions - // move-assign - template <typename T> - VARIANT_INLINE variant<Types...>& operator=(T&& rhs) noexcept - { - variant<Types...> temp(std::forward<T>(rhs)); - move_assign(std::move(temp)); - return *this; - } - - // copy-assign - template <typename T> - VARIANT_INLINE variant<Types...>& operator=(T const& rhs) - { - variant<Types...> temp(rhs); - copy_assign(temp); - return *this; - } - - template <typename T, typename std::enable_if< - (detail::direct_type<T, Types...>::index != - detail::invalid_value)>::type* = nullptr> - VARIANT_INLINE bool is() const - { - return type_index == detail::direct_type<T, Types...>::index; - } - - template <typename T, - typename std::enable_if< - (detail::direct_type<recursive_wrapper<T>, Types...>::index != - detail::invalid_value)>::type* = nullptr> - VARIANT_INLINE bool is() const - { - return type_index == - detail::direct_type<recursive_wrapper<T>, Types...>::index; - } - - VARIANT_INLINE bool valid() const - { - return type_index != detail::invalid_value; - } - - template <typename T, typename... Args> - VARIANT_INLINE void set(Args&&... args) - { - helper_type::destroy(type_index, &data); - type_index = detail::invalid_value; - new (&data) T(std::forward<Args>(args)...); - type_index = detail::direct_type<T, Types...>::index; - } - - // get_unchecked<T>() - template <typename T, typename std::enable_if< - (detail::direct_type<T, Types...>::index != - detail::invalid_value)>::type* = nullptr> - VARIANT_INLINE T& get_unchecked() - { - return *reinterpret_cast<T*>(&data); - } - -#ifdef HAS_EXCEPTIONS - // get<T>() - template <typename T, typename std::enable_if< - (detail::direct_type<T, Types...>::index != - detail::invalid_value)>::type* = nullptr> - VARIANT_INLINE T& get() - { - if (type_index == detail::direct_type<T, Types...>::index) - { - return *reinterpret_cast<T*>(&data); - } - else - { - throw bad_variant_access("in get<T>()"); - } - } -#endif - - template <typename T, typename std::enable_if< - (detail::direct_type<T, Types...>::index != - detail::invalid_value)>::type* = nullptr> - VARIANT_INLINE T const& get_unchecked() const - { - return *reinterpret_cast<T const*>(&data); - } - -#ifdef HAS_EXCEPTIONS - template <typename T, typename std::enable_if< - (detail::direct_type<T, Types...>::index != - detail::invalid_value)>::type* = nullptr> - VARIANT_INLINE T const& get() const - { - if (type_index == detail::direct_type<T, Types...>::index) - { - return *reinterpret_cast<T const*>(&data); - } - else - { - throw bad_variant_access("in get<T>()"); - } - } -#endif - - // get_unchecked<T>() - T stored as recursive_wrapper<T> - template <typename T, - typename std::enable_if< - (detail::direct_type<recursive_wrapper<T>, Types...>::index != - detail::invalid_value)>::type* = nullptr> - VARIANT_INLINE T& get_unchecked() - { - return (*reinterpret_cast<recursive_wrapper<T>*>(&data)).get(); - } - -#ifdef HAS_EXCEPTIONS - // get<T>() - T stored as recursive_wrapper<T> - template <typename T, - typename std::enable_if< - (detail::direct_type<recursive_wrapper<T>, Types...>::index != - detail::invalid_value)>::type* = nullptr> - VARIANT_INLINE T& get() - { - if (type_index == - detail::direct_type<recursive_wrapper<T>, Types...>::index) - { - return (*reinterpret_cast<recursive_wrapper<T>*>(&data)).get(); - } - else - { - throw bad_variant_access("in get<T>()"); - } - } -#endif - - template <typename T, - typename std::enable_if< - (detail::direct_type<recursive_wrapper<T>, Types...>::index != - detail::invalid_value)>::type* = nullptr> - VARIANT_INLINE T const& get_unchecked() const - { - return (*reinterpret_cast<recursive_wrapper<T> const*>(&data)).get(); - } - -#ifdef HAS_EXCEPTIONS - template <typename T, - typename std::enable_if< - (detail::direct_type<recursive_wrapper<T>, Types...>::index != - detail::invalid_value)>::type* = nullptr> - VARIANT_INLINE T const& get() const - { - if (type_index == - detail::direct_type<recursive_wrapper<T>, Types...>::index) - { - return (*reinterpret_cast<recursive_wrapper<T> const*>(&data)) - .get(); - } - else - { - throw bad_variant_access("in get<T>()"); - } - } -#endif - - // get_unchecked<T>() - T stored as std::reference_wrapper<T> - template < - typename T, - typename std::enable_if< - (detail::direct_type<std::reference_wrapper<T>, Types...>::index != - detail::invalid_value)>::type* = nullptr> - VARIANT_INLINE T& get_unchecked() - { - return (*reinterpret_cast<std::reference_wrapper<T>*>(&data)).get(); - } - -#ifdef HAS_EXCEPTIONS - // get<T>() - T stored as std::reference_wrapper<T> - template < - typename T, - typename std::enable_if< - (detail::direct_type<std::reference_wrapper<T>, Types...>::index != - detail::invalid_value)>::type* = nullptr> - VARIANT_INLINE T& get() - { - if (type_index == - detail::direct_type<std::reference_wrapper<T>, Types...>::index) - { - return (*reinterpret_cast<std::reference_wrapper<T>*>(&data)).get(); - } - else - { - throw bad_variant_access("in get<T>()"); - } - } -#endif - - template <typename T, - typename std::enable_if< - (detail::direct_type<std::reference_wrapper<T const>, - Types...>::index != - detail::invalid_value)>::type* = nullptr> - VARIANT_INLINE T const& get_unchecked() const - { - return (*reinterpret_cast<std::reference_wrapper<T const> const*>( - &data)) - .get(); - } - -#ifdef HAS_EXCEPTIONS - template <typename T, - typename std::enable_if< - (detail::direct_type<std::reference_wrapper<T const>, - Types...>::index != - detail::invalid_value)>::type* = nullptr> - VARIANT_INLINE T const& get() const - { - if (type_index == detail::direct_type<std::reference_wrapper<T const>, - Types...>::index) - { - return (*reinterpret_cast<std::reference_wrapper<T const> const*>( - &data)) - .get(); - } - else - { - throw bad_variant_access("in get<T>()"); - } - } -#endif - - // This function is deprecated because it returns an internal index field. - // Use which() instead. - MAPBOX_VARIANT_DEPRECATED VARIANT_INLINE std::size_t get_type_index() const - { - return type_index; - } - - VARIANT_INLINE int which() const noexcept - { - return static_cast<int>(sizeof...(Types) - type_index - 1); - } - - template <typename T, typename std::enable_if< - (detail::direct_type<T, Types...>::index != - detail::invalid_value)>::type* = nullptr> - VARIANT_INLINE static constexpr int which() noexcept - { - return static_cast<int>(sizeof...(Types) - - detail::direct_type<T, Types...>::index - 1); - } - - // visitor - // unary - template <typename F, typename V, - typename R = - typename detail::result_of_unary_visit<F, first_type>::type> - auto VARIANT_INLINE static visit(V const& v, F&& f) - -> decltype(detail::dispatcher<F, V, R, Types...>::apply_const( - v, std::forward<F>(f))) - { - return detail::dispatcher<F, V, R, Types...>::apply_const( - v, std::forward<F>(f)); - } - // non-const - template <typename F, typename V, - typename R = - typename detail::result_of_unary_visit<F, first_type>::type> - auto VARIANT_INLINE static visit(V& v, F&& f) -> decltype( - detail::dispatcher<F, V, R, Types...>::apply(v, std::forward<F>(f))) - { - return detail::dispatcher<F, V, R, Types...>::apply(v, - std::forward<F>(f)); - } - - // binary - // const - template <typename F, typename V, - typename R = - typename detail::result_of_binary_visit<F, first_type>::type> - auto VARIANT_INLINE static binary_visit(V const& v0, V const& v1, F&& f) - -> decltype(detail::binary_dispatcher<F, V, R, Types...>::apply_const( - v0, v1, std::forward<F>(f))) - { - return detail::binary_dispatcher<F, V, R, Types...>::apply_const( - v0, v1, std::forward<F>(f)); - } - // non-const - template <typename F, typename V, - typename R = - typename detail::result_of_binary_visit<F, first_type>::type> - auto VARIANT_INLINE static binary_visit(V& v0, V& v1, F&& f) - -> decltype(detail::binary_dispatcher<F, V, R, Types...>::apply( - v0, v1, std::forward<F>(f))) - { - return detail::binary_dispatcher<F, V, R, Types...>::apply( - v0, v1, std::forward<F>(f)); - } - - ~variant() noexcept // no-throw destructor - { - helper_type::destroy(type_index, &data); - } - - // comparison operators - // equality - VARIANT_INLINE bool operator==(variant const& rhs) const - { - assert(valid() && rhs.valid()); - if (this->which() != rhs.which()) - { - return false; - } - detail::comparer<variant, detail::equal_comp> visitor(*this); - return visit(rhs, visitor); - } - - VARIANT_INLINE bool operator!=(variant const& rhs) const - { - return !(*this == rhs); - } - - // less than - VARIANT_INLINE bool operator<(variant const& rhs) const - { - assert(valid() && rhs.valid()); - if (this->which() != rhs.which()) - { - return this->which() < rhs.which(); - } - detail::comparer<variant, detail::less_comp> visitor(*this); - return visit(rhs, visitor); - } - VARIANT_INLINE bool operator>(variant const& rhs) const - { - return rhs < *this; - } - VARIANT_INLINE bool operator<=(variant const& rhs) const - { - return !(*this > rhs); - } - VARIANT_INLINE bool operator>=(variant const& rhs) const - { - return !(*this < rhs); - } -}; - -// unary visitor interface -// const -template <typename F, typename V> -auto VARIANT_INLINE apply_visitor(F&& f, V const& v) - -> decltype(V::visit(v, std::forward<F>(f))) -{ - return V::visit(v, std::forward<F>(f)); -} - -// non-const -template <typename F, typename V> -auto VARIANT_INLINE apply_visitor(F&& f, V& v) - -> decltype(V::visit(v, std::forward<F>(f))) -{ - return V::visit(v, std::forward<F>(f)); -} - -// binary visitor interface -// const -template <typename F, typename V> -auto VARIANT_INLINE apply_visitor(F&& f, V const& v0, V const& v1) - -> decltype(V::binary_visit(v0, v1, std::forward<F>(f))) -{ - return V::binary_visit(v0, v1, std::forward<F>(f)); -} - -// non-const -template <typename F, typename V> -auto VARIANT_INLINE apply_visitor(F&& f, V& v0, V& v1) - -> decltype(V::binary_visit(v0, v1, std::forward<F>(f))) -{ - return V::binary_visit(v0, v1, std::forward<F>(f)); -} - -// Needed for compatibility with std::variant -template <typename... Args> -constexpr auto visit(Args&&... args) - -> decltype(apply_visitor(std::forward<Args>(args)...)) -{ - return apply_visitor(std::forward<Args>(args)...); -} - -// is interface - -#ifdef HAS_EXCEPTIONS -template <typename ResultType, typename T> -auto holds_alternative(T const& var) -> decltype(var.template is<ResultType>()) -{ - return var.template is<ResultType>(); -} -#endif - -// getter interface - -#ifdef HAS_EXCEPTIONS -template <typename ResultType, typename T> -auto get(T& var) -> decltype(var.template get<ResultType>()) -{ - return var.template get<ResultType>(); -} -#endif - -template <typename ResultType, typename T> -ResultType& get_unchecked(T& var) -{ - return var.template get_unchecked<ResultType>(); -} - -template <typename ResultType, typename... Types> -std::add_pointer_t<ResultType> get_if(variant<Types...>* v) -{ - if (v == nullptr || !v->template is<ResultType>()) - { - return nullptr; - } - return &v->template get_unchecked<ResultType>(); -} - -#ifdef HAS_EXCEPTIONS -template <typename ResultType, typename T> -auto get(T const& var) -> decltype(var.template get<ResultType>()) -{ - return var.template get<ResultType>(); -} -#endif - -template <typename ResultType, typename T> -ResultType const& get_unchecked(T const& var) -{ - return var.template get_unchecked<ResultType>(); -} - -template <typename ResultType, typename... Types> -std::add_pointer_t<const ResultType> get_if(const variant<Types...>* v) -{ - if (v == nullptr || !v->template is<ResultType>()) - { - return nullptr; - } - return &v->template get_unchecked<ResultType>(); -} - -} // namespace util -} // namespace mapbox - -#endif // MAPBOX_UTIL_VARIANT_HPP diff --git a/sdbusplus/message/append.hpp b/sdbusplus/message/append.hpp index efea26d..1a414d2 100644 --- a/sdbusplus/message/append.hpp +++ b/sdbusplus/message/append.hpp @@ -283,7 +283,7 @@ struct append_single<variant<Args...>> intf->sd_bus_message_close_container(m); }; - std::remove_reference_t<S>::visit(s, apply); + std::visit(apply, s); } }; diff --git a/sdbusplus/message/types.hpp b/sdbusplus/message/types.hpp index 4dd5e3d..141c656 100644 --- a/sdbusplus/message/types.hpp +++ b/sdbusplus/message/types.hpp @@ -3,12 +3,12 @@ #include <systemd/sd-bus.h> #include <map> -#include <mapbox/variant.hpp> #include <sdbusplus/message/native_types.hpp> #include <sdbusplus/utility/container_traits.hpp> #include <sdbusplus/utility/type_traits.hpp> #include <string> #include <tuple> +#include <variant> #include <vector> namespace sdbusplus @@ -17,7 +17,7 @@ namespace sdbusplus namespace message { -namespace variant_ns = mapbox::util; +namespace variant_ns = std; template <typename... Args> using variant = variant_ns::variant<Args...>; |

