namespace ov::element

namespace element {

// typedefs

typedef std::vector<Type> TypeVector;

// enums

enum Type_t;

// classes

class Type;

// global functions

constexpr Type undefined(Type_t::undefined);
constexpr Type dynamic(Type_t::dynamic);
constexpr Type boolean(Type_t::boolean);
constexpr Type bf16(Type_t::bf16);
constexpr Type f16(Type_t::f16);
constexpr Type f32(Type_t::f32);
constexpr Type f64(Type_t::f64);
constexpr Type i4(Type_t::i4);
constexpr Type i8(Type_t::i8);
constexpr Type i16(Type_t::i16);
constexpr Type i32(Type_t::i32);
constexpr Type i64(Type_t::i64);
constexpr Type u1(Type_t::u1);
constexpr Type u4(Type_t::u4);
constexpr Type u8(Type_t::u8);
constexpr Type u16(Type_t::u16);
constexpr Type u32(Type_t::u32);
constexpr Type u64(Type_t::u64);

template <typename T>
Type from();

OPENVINO_API Type from< char >();
OPENVINO_API Type from< bool >();
OPENVINO_API Type from< float >();
OPENVINO_API Type from< double >();
OPENVINO_API Type from< int8_t >();
OPENVINO_API Type from< int16_t >();
OPENVINO_API Type from< int32_t >();
OPENVINO_API Type from< int64_t >();
OPENVINO_API Type from< uint8_t >();
OPENVINO_API Type from< uint16_t >();
OPENVINO_API Type from< uint32_t >();
OPENVINO_API Type from< uint64_t >();
OPENVINO_API Type from< ov::bfloat16 >();
OPENVINO_API Type from< ov::float16 >();
OPENVINO_API Type fundamental_type_for(const Type& type);

OPENVINO_API std::ostream& operator << (
    std::ostream& out,
    const ov::element::Type& obj
    );

OPENVINO_API std::istream& operator >> (
    std::istream& out,
    ov::element::Type& obj
    );

} // namespace element