1616#ifdef __has_include
1717#if __cplusplus > 201402 && __has_include(<optional>)
1818#define MODERN_SQLITE_STD_OPTIONAL_SUPPORT
19+ #elif __has_include(<experimental/optional>)
20+ #ifdef _MODERN_SQLITE_EXPERIMENTAL_OPTIONAL_SUPPORT
21+ #define MODERN_SQLITE_EXPERIMENTAL_OPTIONAL_SUPPORT
22+ #endif
1923#endif
2024#endif
2125
2731
2832#ifdef MODERN_SQLITE_STD_OPTIONAL_SUPPORT
2933#include < optional>
30- #elif _MODERN_SQLITE_EXPERIMENTAL_OPTIONAL_SUPPORT && __has_include(<experimental/optional>)
34+ #endif
35+
36+ #ifdef MODERN_SQLITE_EXPERIMENTAL_OPTIONAL_SUPPORT
3137#include < experimental/optional>
3238#endif
3339
@@ -239,9 +245,16 @@ namespace sqlite {
239245 friend database_binder& operator <<(database_binder& db, const std::u16string& txt);
240246
241247
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);
248+ #ifdef MODERN_SQLITE_STD_OPTIONAL_SUPPORT || MODERN_SQLITE_EXPERIMENTAL_OPTIONAL_SUPPORT
249+ #ifdef MODERN_SQLITE_STD_OPTIONAL_SUPPORT
250+ template <class T >
251+ using optional = std::optional<T>;
252+ #else
253+ template <class T >
254+ using optional = std::experimental::optional<T>;
255+ #endif
256+ template <typename OptionalT> friend database_binder& operator <<(database_binder& db, const optional<OptionalT>& val);
257+ template <typename OptionalT> friend void get_col_from_db (database_binder& db, int inx, optional<OptionalT>& o);
245258#endif
246259
247260#ifdef _MODERN_SQLITE_BOOST_OPTIONAL_SUPPORT
@@ -791,22 +804,22 @@ namespace sqlite {
791804 }
792805
793806 // 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) {
807+ #ifdef MODERN_SQLITE_STD_OPTIONAL_SUPPORT || MODERN_SQLITE_EXPERIMENTAL_OPTIONAL_SUPPORT
808+ template <typename OptionalT> inline database_binder& operator <<(database_binder& db, const optional<OptionalT>& val) {
796809 if (val) {
797810 return db << std::move (*val);
798811 } else {
799812 return db << nullptr ;
800813 }
801814 }
802- template <typename OptionalT> inline void store_result_in_db (sqlite3_context* db, const std:: optional<OptionalT>& val) {
815+ template <typename OptionalT> inline void store_result_in_db (sqlite3_context* db, const optional<OptionalT>& val) {
803816 if (val) {
804817 store_result_in_db (db, *val);
805818 }
806819 sqlite3_result_null (db);
807820 }
808821
809- template <typename OptionalT> inline void get_col_from_db (database_binder& db, int inx, std:: optional<OptionalT>& o) {
822+ template <typename OptionalT> inline void get_col_from_db (database_binder& db, int inx, optional<OptionalT>& o) {
810823 if (sqlite3_column_type (db._stmt .get (), inx) == SQLITE_NULL) {
811824 o.reset ();
812825 } else {
@@ -815,7 +828,7 @@ namespace sqlite {
815828 o = std::move (v);
816829 }
817830 }
818- template <typename OptionalT> inline void get_val_from_db (sqlite3_value *value, std:: optional<OptionalT>& o) {
831+ template <typename OptionalT> inline void get_val_from_db (sqlite3_value *value, optional<OptionalT>& o) {
819832 if (sqlite3_value_type (value) == SQLITE_NULL) {
820833 o.reset ();
821834 } else {
0 commit comments