2626#endif
2727
2828#ifdef MODERN_SQLITE_STD_OPTIONAL_SUPPORT
29- #include < optional>
30- template <class T >
31- using optional = std::optional<T>;
32- #define MODERN_SQLITE_OPTIONAL_SUPPORT
29+ #include < optional>
3330#elif _MODERN_SQLITE_EXPERIMENTAL_OPTIONAL_SUPPORT && __has_include(<experimental/optional>)
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
31+ #include < experimental/optional>
32+ #endif
33+
34+ #ifdef _MODERN_SQLITE_BOOST_OPTIONAL_SUPPORT
35+ #include < boost/optional.hpp>
4336#endif
4437
4538#include < sqlite3.h>
@@ -246,9 +239,14 @@ namespace sqlite {
246239 friend database_binder& operator <<(database_binder& db, const std::u16string& txt);
247240
248241
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);
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);
252250#endif
253251
254252 public:
@@ -792,23 +790,23 @@ namespace sqlite {
792790 val = i;
793791 }
794792
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) {
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) {
798796 if (val) {
799797 return db << std::move (*val);
800798 } else {
801799 return db << nullptr ;
802800 }
803801 }
804- template <typename OptionalT> inline void store_result_in_db (sqlite3_context* db, const optional<OptionalT>& val) {
802+ template <typename OptionalT> inline void store_result_in_db (sqlite3_context* db, const std:: optional<OptionalT>& val) {
805803 if (val) {
806804 store_result_in_db (db, *val);
807805 }
808806 sqlite3_result_null (db);
809807 }
810808
811- template <typename OptionalT> inline void get_col_from_db (database_binder& db, int inx, optional<OptionalT>& o) {
809+ template <typename OptionalT> inline void get_col_from_db (database_binder& db, int inx, std:: optional<OptionalT>& o) {
812810 if (sqlite3_column_type (db._stmt .get (), inx) == SQLITE_NULL) {
813811 o.reset ();
814812 } else {
@@ -817,7 +815,7 @@ namespace sqlite {
817815 o = std::move (v);
818816 }
819817 }
820- template <typename OptionalT> inline void get_val_from_db (sqlite3_value *value, optional<OptionalT>& o) {
818+ template <typename OptionalT> inline void get_val_from_db (sqlite3_value *value, std:: optional<OptionalT>& o) {
821819 if (sqlite3_value_type (value) == SQLITE_NULL) {
822820 o.reset ();
823821 } else {
@@ -828,6 +826,42 @@ namespace sqlite {
828826 }
829827#endif
830828
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+
831865#ifdef MODERN_SQLITE_STD_VARIANT_SUPPORT
832866 template <typename ...Args> inline database_binder& operator <<(database_binder& db, const std::variant<Args...>& val) {
833867 std::visit ([&](auto &&opt) {db << std::forward<decltype (opt)>(opt);}, val);
0 commit comments