Program Listing for File any.h#

Return to documentation for file (support\any.h)

#ifndef SDV_ANY_H
#define SDV_ANY_H

#include <string>
#include <algorithm>
#include <ostream>
#include <istream>
#include <filesystem>
#include "string.h"
#include "interface.h"
#include "except.h"

namespace sdv
{
    class any_t
    {
    public:
        enum class EValType : uint32_t
        {
            val_type_empty = 0,
            val_type_bool = 1,
            val_type_int8 = 8,
            val_type_uint8 = 9,
            val_type_int16 = 16,
            val_type_uint16 = 17,
            val_type_int32 = 32,
            val_type_uint32 = 33,
            val_type_int64 = 64,
            val_type_uint64 = 65,
            val_type_char = 100,
            val_type_char16 = 116,
            val_type_char32 = 132,
            val_type_wchar = 101,
            val_type_float = 232,
            val_type_double = 264,
            val_type_long_double = 265,
            val_type_fixed = 300,
            val_type_string = 1000,
            val_type_u8string = 1008,
            val_type_u16string = 1016,
            val_type_u32string = 1032,
            val_type_wstring = 1001,
            val_type_interface = 2000,
            val_type_interface_id = 2001,
            val_type_exception_id = 3000,
        } eValType = EValType::val_type_empty;

        union
        {
            bool            bVal;
            int8_t          i8Val;
            uint8_t         ui8Val;
            int16_t         i16Val;
            uint16_t        ui16Val;
            int32_t         i32Val;
            uint32_t        ui32Val;
            int64_t         i64Val;
            uint64_t        ui64Val;
            char            cVal;
            char16_t        c16Val;
            char32_t        c32Val;
            wchar_t         cwVal;
            float           fVal;
            double          dVal;
            long double     ldVal;
            //fixed           fixValue;       ///< Fixed point value
            string          ssVal;
            u8string        ss8Val;
            u16string       ss16Val;
            u32string       ss32Val;
            wstring         sswVal;
            interface_t     ifcVal;
            interface_id    idIfcVal;
            exception_id    idExceptVal;
        };

        any_t();

        ~any_t();

        template <typename TType>
        explicit any_t(TType tVal);

        explicit any_t(const string& rssVal);
        explicit any_t(const u8string& rssVal);
        explicit any_t(const u16string& rssVal);
        explicit any_t(const u32string& rssVal);
        explicit any_t(const wstring& rssVal);
        any_t(const char* sz);

        any_t(const char16_t* sz);

        any_t(const char32_t* sz);

        any_t(const wchar_t* sz);

        explicit any_t(const std::string& rssVal);
        explicit any_t(const std::u16string& rssVal);
        explicit any_t(const std::u32string& rssVal);
        explicit any_t(const std::wstring& rssVal);
        template <typename TType>
        any_t(TType tVal, EValType eValTypeParam);

        any_t(const any_t& rany);

        any_t(any_t&& rany) noexcept;

        template <typename TType>
        any_t& operator=(TType tVal);

        any_t& operator=(const any_t& rany);

        any_t& operator=(any_t&& rany) noexcept;

        operator bool() const;
        operator int8_t() const;
        operator uint8_t() const;
        operator int16_t() const;
        operator uint16_t() const;
        operator int32_t() const;
        operator uint32_t() const;
        operator int64_t() const;
        operator uint64_t() const;
#ifdef __linux__
        operator long long int() const { return static_cast<long long int>(operator int64_t()); }
        operator unsigned long long int() const { return static_cast<long long int>(operator uint64_t()); }
#endif
        operator char() const;
        operator char16_t() const;
        operator char32_t() const;
        operator wchar_t() const;
        operator float() const;
        operator double() const;
        operator long double() const;
        //operator fixed() const;
        operator string() const;
        operator u8string() const;
        operator u16string() const;
        operator u32string() const;
        operator wstring() const;
        operator interface_t() const;
        //operator interface_id() const;
        //operator exception_id() const;
        operator std::string() const;
        operator std::u16string() const;
        operator std::u32string() const;
        operator std::wstring() const;
        bool empty() const;

        void clear();

        template <typename TType>
        void set(TType tVal);

        template <typename TType>
        void set(TType tVal, EValType eValTypeParam);

        template <typename TType>
        TType get() const;

        enum class ECompareType
        {
            compare_equal,
            compare_inequal,
            compare_smaller,
            compare_smaller_equal,
            compare_larger,
            compare_larger_equal,
        };

        template <typename TType, ECompareType eType>
        bool Compare(const TType& rtVal) const;

        template <ECompareType eType>
        bool Compare(const any_t& ranyVal) const;

    private:
        template <typename TSourceType, typename TDestType>
        static void convert(const TSourceType& rtSrcVal, TDestType& rtDstVal);
    };

    template <typename TType>
    bool operator==(const sdv::any_t& ranyVal1, TType tVal2);

    template <typename TType>
    bool operator==(TType tVal1, const sdv::any_t& ranyVal2);

    bool operator==(const sdv::any_t& ranyVal1, const sdv::any_t& ranyVal2);

    template <typename TType>
    bool operator!=(const sdv::any_t& ranyVal1, TType tVal2);

    template <typename TType>
    bool operator!=(TType tVal1, const sdv::any_t& ranyVal2);

    bool operator!=(const sdv::any_t& ranyVal1, const sdv::any_t& ranyVal2);

    template <typename TType>
    bool operator<(const sdv::any_t& ranyVal1, TType tVal2);

    template <typename TType>
    bool operator<(TType tVal1, const sdv::any_t& ranyVal2);

    bool operator<(const sdv::any_t& ranyVal1, const sdv::any_t& ranyVal2);

    template <typename TType>
    bool operator<=(const sdv::any_t& ranyVal1, TType tVal2);

    template <typename TType>
    bool operator<=(TType tVal1, const sdv::any_t& ranyVal2);

    bool operator<=(const sdv::any_t& ranyVal1, const sdv::any_t& ranyVal2);

    template <typename TType>
    bool operator>(const sdv::any_t& ranyVal1, TType tVal2);

    template <typename TType>
    bool operator>(TType tVal1, const sdv::any_t& ranyVal2);

    bool operator>(const sdv::any_t& ranyVal1, const sdv::any_t& ranyVal2);

    template <typename TType>
    bool operator>=(const sdv::any_t& ranyVal1, TType tVal2);

    template <typename TType>
    bool operator>=(TType tVal1, const sdv::any_t& ranyVal2);

    bool operator>=(const sdv::any_t& ranyVal1, const sdv::any_t& ranyVal2);

}

#include "any.inl"

#endif // !defined SDV_ANY_H