// Copyright (C) 2010 Davis E. King (davis@dlib.net) // License: Boost Software License See LICENSE.txt for the full license. #ifndef DLIB_AnY_H_ #define DLIB_AnY_H_ #include "any_abstract.h" #include <memory> #include "storage.h" namespace dlib { // ---------------------------------------------------------------------------------------- class any { public: any() = default; any(const any& other) = default; any& operator=(const any& other) = default; any(any&& other) = default; any& operator=(any&& other) = default; template< typename T, std::enable_if_t<!std::is_same<std::decay_t<T>, any>::value, bool> = true > any(T&& item) : storage{std::forward<T>(item)} { } template< typename T, typename T_ = std::decay_t<T>, std::enable_if_t<!std::is_same<T_, any>::value, bool> = true > any& operator=(T&& item) { if (contains<T_>()) storage.unsafe_get<T_>() = std::forward<T>(item); else *this = std::move(any{std::forward<T>(item)}); return *this; } bool is_empty() const { return storage.is_empty(); } void clear() { storage.clear(); } void swap (any& item) { std::swap(*this, item); } template<typename T> bool contains() const { return storage.contains<T>();} template <typename T> T& cast_to() { return storage.cast_to<T>(); } template <typename T> const T& cast_to() const { return storage.cast_to<T>(); } template <typename T> T& get() { return storage.get<T>(); } private: te::storage_heap storage; }; // ---------------------------------------------------------------------------------------- template <typename T> T& any_cast(any& a) { return a.cast_to<T>(); } template <typename T> const T& any_cast(const any& a) { return a.cast_to<T>(); } // ---------------------------------------------------------------------------------------- } #endif // DLIB_AnY_H_