123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999 |
- #ifndef BOOST_MYSQL_FIELD_HPP
- #define BOOST_MYSQL_FIELD_HPP
- #include <boost/mysql/blob.hpp>
- #include <boost/mysql/field_kind.hpp>
- #include <boost/mysql/field_view.hpp>
- #include <boost/mysql/string_view.hpp>
- #include <boost/mysql/detail/config.hpp>
- #include <boost/mysql/detail/field_impl.hpp>
- #include <boost/variant2/variant.hpp>
- #include <cstddef>
- #include <iosfwd>
- #include <string>
- #ifdef __cpp_lib_string_view
- #include <string_view>
- #endif
- namespace boost {
- namespace mysql {
- class field
- {
- public:
-
- field() = default;
-
- field(const field&) = default;
-
- field(field&& other) = default;
-
- field& operator=(const field&) = default;
-
- field& operator=(field&& other) = default;
-
- ~field() = default;
-
- explicit field(std::nullptr_t) noexcept {}
-
- explicit field(signed char v) noexcept : repr_(std::int64_t(v)) {}
-
- explicit field(short v) noexcept : repr_(std::int64_t(v)) {}
-
- explicit field(int v) noexcept : repr_(std::int64_t(v)) {}
-
- explicit field(long v) noexcept : repr_(std::int64_t(v)) {}
-
- explicit field(long long v) noexcept : repr_(std::int64_t(v)) {}
-
- explicit field(unsigned char v) noexcept : repr_(std::uint64_t(v)) {}
-
- explicit field(unsigned short v) noexcept : repr_(std::uint64_t(v)) {}
-
- explicit field(unsigned int v) noexcept : repr_(std::uint64_t(v)) {}
-
- explicit field(unsigned long v) noexcept : repr_(std::uint64_t(v)) {}
-
- explicit field(unsigned long long v) noexcept : repr_(std::uint64_t(v)) {}
-
- explicit field(char) = delete;
-
- explicit field(wchar_t) = delete;
-
- explicit field(char16_t) = delete;
-
- explicit field(char32_t) = delete;
- #ifdef __cpp_char8_t
-
- explicit field(char8_t) = delete;
- #endif
-
- explicit field(const std::string& v) : repr_(v) {}
-
- explicit field(std::string&& v) noexcept : repr_(std::move(v)) {}
-
- explicit field(const char* v) : repr_(boost::variant2::in_place_type_t<std::string>(), v) {}
-
- explicit field(string_view v) : repr_(boost::variant2::in_place_type_t<std::string>(), v) {}
- #if defined(__cpp_lib_string_view)
-
- explicit field(std::string_view v) noexcept : repr_(boost::variant2::in_place_type_t<std::string>(), v) {}
- #endif
-
- explicit field(blob v) noexcept : repr_(std::move(v)) {}
-
- explicit field(float v) noexcept : repr_(v) {}
-
- explicit field(double v) noexcept : repr_(v) {}
-
- explicit field(const date& v) noexcept : repr_(v) {}
-
- explicit field(const datetime& v) noexcept : repr_(v) {}
-
- explicit field(const time& v) noexcept : repr_(v) {}
-
- field(const field_view& v) { from_view(v); }
-
- field& operator=(std::nullptr_t) noexcept
- {
- repr_.data.emplace<detail::field_impl::null_t>();
- return *this;
- }
-
- field& operator=(signed char v) noexcept
- {
- repr_.data.emplace<std::int64_t>(v);
- return *this;
- }
-
- field& operator=(short v) noexcept
- {
- repr_.data.emplace<std::int64_t>(v);
- return *this;
- }
-
- field& operator=(int v) noexcept
- {
- repr_.data.emplace<std::int64_t>(v);
- return *this;
- }
-
- field& operator=(long v) noexcept
- {
- repr_.data.emplace<std::int64_t>(v);
- return *this;
- }
-
- field& operator=(long long v) noexcept
- {
- repr_.data.emplace<std::int64_t>(v);
- return *this;
- }
-
- field& operator=(unsigned char v) noexcept
- {
- repr_.data.emplace<std::uint64_t>(v);
- return *this;
- }
-
- field& operator=(unsigned short v) noexcept
- {
- repr_.data.emplace<std::uint64_t>(v);
- return *this;
- }
-
- field& operator=(unsigned int v) noexcept
- {
- repr_.data.emplace<std::uint64_t>(v);
- return *this;
- }
-
- field& operator=(unsigned long v) noexcept
- {
- repr_.data.emplace<std::uint64_t>(v);
- return *this;
- }
-
- field& operator=(unsigned long long v) noexcept
- {
- repr_.data.emplace<std::uint64_t>(v);
- return *this;
- }
-
- field& operator=(char) = delete;
-
- field& operator=(wchar_t) = delete;
-
- field& operator=(char16_t) = delete;
-
- field& operator=(char32_t) = delete;
- #ifdef __cpp_char8_t
-
- field& operator=(char8_t) = delete;
- #endif
-
- field& operator=(const std::string& v)
- {
- repr_.data.emplace<std::string>(v);
- return *this;
- }
-
- field& operator=(std::string&& v)
- {
- repr_.data.emplace<std::string>(std::move(v));
- return *this;
- }
-
- field& operator=(const char* v)
- {
- repr_.data.emplace<std::string>(v);
- return *this;
- }
-
- field& operator=(string_view v)
- {
- repr_.data.emplace<std::string>(v);
- return *this;
- }
- #if defined(__cpp_lib_string_view)
-
- field& operator=(std::string_view v)
- {
- repr_.data.emplace<std::string>(v);
- return *this;
- }
- #endif
-
- field& operator=(blob v)
- {
- repr_.data.emplace<blob>(std::move(v));
- return *this;
- }
-
- field& operator=(float v) noexcept
- {
- repr_.data.emplace<float>(v);
- return *this;
- }
-
- field& operator=(double v) noexcept
- {
- repr_.data.emplace<double>(v);
- return *this;
- }
-
- field& operator=(const date& v) noexcept
- {
- repr_.data.emplace<date>(v);
- return *this;
- }
-
- field& operator=(const datetime& v) noexcept
- {
- repr_.data.emplace<datetime>(v);
- return *this;
- }
-
- field& operator=(const time& v) noexcept
- {
- repr_.data.emplace<time>(v);
- return *this;
- }
-
- field& operator=(const field_view& v)
- {
- from_view(v);
- return *this;
- }
-
- field_kind kind() const noexcept { return repr_.kind(); }
-
- bool is_null() const noexcept { return kind() == field_kind::null; }
-
- bool is_int64() const noexcept { return kind() == field_kind::int64; }
-
- bool is_uint64() const noexcept { return kind() == field_kind::uint64; }
-
- bool is_string() const noexcept { return kind() == field_kind::string; }
-
- bool is_blob() const noexcept { return kind() == field_kind::blob; }
-
- bool is_float() const noexcept { return kind() == field_kind::float_; }
-
- bool is_double() const noexcept { return kind() == field_kind::double_; }
-
- bool is_date() const noexcept { return kind() == field_kind::date; }
-
- bool is_datetime() const noexcept { return kind() == field_kind::datetime; }
-
- bool is_time() const noexcept { return kind() == field_kind::time; }
-
- const std::int64_t& as_int64() const { return repr_.as<std::int64_t>(); }
-
- const std::uint64_t& as_uint64() const { return repr_.as<std::uint64_t>(); }
-
- const std::string& as_string() const { return repr_.as<std::string>(); }
-
- const blob& as_blob() const { return repr_.as<blob>(); }
-
- const float& as_float() const { return repr_.as<float>(); }
-
- const double& as_double() const { return repr_.as<double>(); }
-
- const date& as_date() const { return repr_.as<date>(); }
-
- const datetime& as_datetime() const { return repr_.as<datetime>(); }
-
- const time& as_time() const { return repr_.as<time>(); }
-
- std::int64_t& as_int64() { return repr_.as<std::int64_t>(); }
-
- std::uint64_t& as_uint64() { return repr_.as<std::uint64_t>(); }
-
- std::string& as_string() { return repr_.as<std::string>(); }
-
- blob& as_blob() { return repr_.as<blob>(); }
-
- float& as_float() { return repr_.as<float>(); }
-
- double& as_double() { return repr_.as<double>(); }
-
- date& as_date() { return repr_.as<date>(); }
-
- datetime& as_datetime() { return repr_.as<datetime>(); }
-
- time& as_time() { return repr_.as<time>(); }
-
- const std::int64_t& get_int64() const noexcept { return repr_.get<std::int64_t>(); }
-
- const std::uint64_t& get_uint64() const noexcept { return repr_.get<std::uint64_t>(); }
-
- const std::string& get_string() const noexcept { return repr_.get<std::string>(); }
-
- const blob& get_blob() const noexcept { return repr_.get<blob>(); }
-
- const float& get_float() const noexcept { return repr_.get<float>(); }
-
- const double& get_double() const noexcept { return repr_.get<double>(); }
-
- const date& get_date() const noexcept { return repr_.get<date>(); }
-
- const datetime& get_datetime() const noexcept { return repr_.get<datetime>(); }
-
- const time& get_time() const noexcept { return repr_.get<time>(); }
-
- std::int64_t& get_int64() noexcept { return repr_.get<std::int64_t>(); }
-
- std::uint64_t& get_uint64() noexcept { return repr_.get<std::uint64_t>(); }
-
- std::string& get_string() noexcept { return repr_.get<std::string>(); }
-
- blob& get_blob() noexcept { return repr_.get<blob>(); }
-
- float& get_float() noexcept { return repr_.get<float>(); }
-
- double& get_double() noexcept { return repr_.get<double>(); }
-
- date& get_date() noexcept { return repr_.get<date>(); }
-
- datetime& get_datetime() noexcept { return repr_.get<datetime>(); }
-
- time& get_time() noexcept { return repr_.get<time>(); }
-
- inline operator field_view() const noexcept { return field_view(&repr_); }
- private:
- detail::field_impl repr_;
- BOOST_MYSQL_DECL
- void from_view(const field_view& v);
- };
- inline bool operator==(const field& lhs, const field& rhs) noexcept
- {
- return field_view(lhs) == field_view(rhs);
- }
- inline bool operator!=(const field& lhs, const field& rhs) noexcept { return !(lhs == rhs); }
- inline bool operator==(const field_view& lhs, const field& rhs) noexcept { return lhs == field_view(rhs); }
- inline bool operator!=(const field_view& lhs, const field& rhs) noexcept { return !(lhs == rhs); }
- inline bool operator==(const field& lhs, const field_view& rhs) noexcept { return field_view(lhs) == rhs; }
- inline bool operator!=(const field& lhs, const field_view& rhs) noexcept { return !(lhs == rhs); }
- BOOST_MYSQL_DECL
- std::ostream& operator<<(std::ostream& os, const field& v);
- }
- }
- #ifdef BOOST_MYSQL_HEADER_ONLY
- #include <boost/mysql/impl/field.ipp>
- #endif
- #endif
|