2626#endif
2727
2828#ifdef MODERN_SQLITE_STD_OPTIONAL_SUPPORT
29- #include < optional>
29+ #include < optional>
30+ template <class T >
31+ using optional = std::optional<T>;
32+ #define MODERN_SQLITE_OPTIONAL_SUPPORT
3033#elif _MODERN_SQLITE_EXPERIMENTAL_OPTIONAL_SUPPORT && __has_include(<experimental/optional>)
31- #include < experimental/optional>
32- #endif
33-
34- #ifdef _MODERN_SQLITE_BOOST_OPTIONAL_SUPPORT
35- #include < boost/optional.hpp>
34+ #include < experimental/optional>
35+ template <class T >
36+ using optional = std::experimental::optional<T>;
37+ #define MODERN_SQLITE_OPTIONAL_SUPPORT
38+ #elif _MODERN_SQLITE_BOOST_OPTIONAL_SUPPORT
39+ #include < boost/optional.hpp>
40+ template <class T >
41+ using optional = boost::optional<T>;
42+ #define MODERN_SQLITE_OPTIONAL_SUPPORT
3643#endif
3744
3845#include < sqlite3.h>
@@ -239,14 +246,9 @@ namespace sqlite {
239246 friend database_binder& operator <<(database_binder& db, const std::u16string& txt);
240247
241248
242- #ifdef MODERN_SQLITE_STD_OPTIONAL_SUPPORT
243- template <typename OptionalT> friend database_binder& operator <<(database_binder& db, const std::optional<OptionalT>& val);
244- template <typename OptionalT> friend void get_col_from_db (database_binder& db, int inx, std::optional<OptionalT>& o);
245- #endif
246-
247- #ifdef _MODERN_SQLITE_BOOST_OPTIONAL_SUPPORT
248- template <typename BoostOptionalT> friend database_binder& operator <<(database_binder& db, const boost::optional<BoostOptionalT>& val);
249- template <typename BoostOptionalT> friend void get_col_from_db (database_binder& db, int inx, boost::optional<BoostOptionalT>& o);
249+ #ifdef MODERN_SQLITE_OPTIONAL_SUPPORT
250+ template <typename OptionalT> friend database_binder& operator <<(database_binder& db, const optional<OptionalT>& val);
251+ template <typename OptionalT> friend void get_col_from_db (database_binder& db, int inx, optional<OptionalT>& o);
250252#endif
251253
252254 public:
@@ -790,23 +792,23 @@ namespace sqlite {
790792 val = i;
791793 }
792794
793- // std:: optional support for NULL values
794- #ifdef MODERN_SQLITE_STD_OPTIONAL_SUPPORT
795- template <typename OptionalT> inline database_binder& operator <<(database_binder& db, const std:: optional<OptionalT>& val) {
795+ // optional support for NULL values, whether std::optional, std::experimental::optional or boost:optional
796+ #ifdef MODERN_SQLITE_OPTIONAL_SUPPORT
797+ template <typename OptionalT> inline database_binder& operator <<(database_binder& db, const optional<OptionalT>& val) {
796798 if (val) {
797799 return db << std::move (*val);
798800 } else {
799801 return db << nullptr ;
800802 }
801803 }
802- template <typename OptionalT> inline void store_result_in_db (sqlite3_context* db, const std:: optional<OptionalT>& val) {
804+ template <typename OptionalT> inline void store_result_in_db (sqlite3_context* db, const optional<OptionalT>& val) {
803805 if (val) {
804806 store_result_in_db (db, *val);
805807 }
806808 sqlite3_result_null (db);
807809 }
808810
809- template <typename OptionalT> inline void get_col_from_db (database_binder& db, int inx, std:: optional<OptionalT>& o) {
811+ template <typename OptionalT> inline void get_col_from_db (database_binder& db, int inx, optional<OptionalT>& o) {
810812 if (sqlite3_column_type (db._stmt .get (), inx) == SQLITE_NULL) {
811813 o.reset ();
812814 } else {
@@ -815,7 +817,7 @@ namespace sqlite {
815817 o = std::move (v);
816818 }
817819 }
818- template <typename OptionalT> inline void get_val_from_db (sqlite3_value *value, std:: optional<OptionalT>& o) {
820+ template <typename OptionalT> inline void get_val_from_db (sqlite3_value *value, optional<OptionalT>& o) {
819821 if (sqlite3_value_type (value) == SQLITE_NULL) {
820822 o.reset ();
821823 } else {
@@ -826,42 +828,6 @@ namespace sqlite {
826828 }
827829#endif
828830
829- // boost::optional support for NULL values
830- #ifdef _MODERN_SQLITE_BOOST_OPTIONAL_SUPPORT
831- template <typename BoostOptionalT> inline database_binder& operator <<(database_binder& db, const boost::optional<BoostOptionalT>& val) {
832- if (val) {
833- return db << std::move (*val);
834- } else {
835- return db << nullptr ;
836- }
837- }
838- template <typename BoostOptionalT> inline void store_result_in_db (sqlite3_context* db, const boost::optional<BoostOptionalT>& val) {
839- if (val) {
840- store_result_in_db (db, *val);
841- }
842- sqlite3_result_null (db);
843- }
844-
845- template <typename BoostOptionalT> inline void get_col_from_db (database_binder& db, int inx, boost::optional<BoostOptionalT>& o) {
846- if (sqlite3_column_type (db._stmt .get (), inx) == SQLITE_NULL) {
847- o.reset ();
848- } else {
849- BoostOptionalT v;
850- get_col_from_db (db, inx, v);
851- o = std::move (v);
852- }
853- }
854- template <typename BoostOptionalT> inline void get_val_from_db (sqlite3_value *value, boost::optional<BoostOptionalT>& o) {
855- if (sqlite3_value_type (value) == SQLITE_NULL) {
856- o.reset ();
857- } else {
858- BoostOptionalT v;
859- get_val_from_db (value, v);
860- o = std::move (v);
861- }
862- }
863- #endif
864-
865831#ifdef MODERN_SQLITE_STD_VARIANT_SUPPORT
866832 template <typename ...Args> inline database_binder& operator <<(database_binder& db, const std::variant<Args...>& val) {
867833 std::visit ([&](auto &&opt) {db << std::forward<decltype (opt)>(opt);}, val);
0 commit comments