123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156 |
- #ifndef __ASIO2_USER_DATA_COMPONENT_HPP__
- #define __ASIO2_USER_DATA_COMPONENT_HPP__
- #if defined(_MSC_VER) && (_MSC_VER >= 1200)
- #pragma once
- #endif
- #include <any>
- #include <asio2/base/error.hpp>
- namespace asio2::detail
- {
- template<class derived_t, class args_t = void>
- class user_data_cp
- {
- public:
-
- user_data_cp() = default;
-
- ~user_data_cp() = default;
- user_data_cp(user_data_cp&&) noexcept = default;
- user_data_cp(user_data_cp const&) = default;
- user_data_cp& operator=(user_data_cp&&) noexcept = default;
- user_data_cp& operator=(user_data_cp const&) = default;
- public:
-
- template<class DataT>
- [[deprecated("Replace user_data with set_user_data")]]
- inline derived_t & user_data(DataT && data)
- {
- return this->set_user_data(std::forward<DataT>(data));
- }
-
- template<class DataT>
- [[deprecated("Replace user_data with get_user_data")]]
- inline DataT user_data() noexcept
- {
- return this->get_user_data<DataT>();
- }
-
- template<class DataT>
- inline derived_t & set_user_data(DataT && data)
- {
- this->user_data_ = std::forward<DataT>(data);
- return (static_cast<derived_t &>(*this));
- }
-
- template<class DataT>
- inline DataT get_user_data() noexcept
- {
- if constexpr (std::is_reference_v<DataT>)
- {
- typename std::add_pointer_t<std::remove_reference_t<DataT>> r =
- std::any_cast<std::remove_reference_t<DataT>>(std::addressof(this->user_data_));
- if (r)
- {
- return (*r);
- }
- else
- {
- static typename std::remove_reference_t<DataT> st{};
- return st;
- }
- }
- else if constexpr (std::is_pointer_v<DataT>)
- {
-
- if (this->user_data_.type() == typeid(DataT))
- return std::any_cast<DataT>(this->user_data_);
-
- return std::any_cast<std::remove_pointer_t<DataT>>(std::addressof(this->user_data_));
- }
- else
- {
- #if !defined(ASIO_NO_EXCEPTIONS) && !defined(BOOST_ASIO_NO_EXCEPTIONS)
- try
- {
- #endif
- return std::any_cast<DataT>(this->user_data_);
- #if !defined(ASIO_NO_EXCEPTIONS) && !defined(BOOST_ASIO_NO_EXCEPTIONS)
- }
- catch (const std::bad_any_cast&)
- {
- if (this->user_data_.has_value())
- {
- ASIO2_ASSERT(false);
- }
- }
- return DataT{};
- #endif
- }
- }
-
- inline derived_t& clear_user_data() noexcept
- {
- this->user_data_.reset();
- return (static_cast<derived_t&>(*this));
- }
-
- inline std::any& user_data_any() noexcept { return this->user_data_; }
-
- inline std::any const& user_data_any() const noexcept { return this->user_data_; }
- protected:
-
- std::any user_data_;
- };
- }
- #endif
|