|
16 | 16 | #ifdef __has_include
|
17 | 17 | #if __cplusplus > 201402 && __has_include(<optional>)
|
18 | 18 | #define MODERN_SQLITE_STD_OPTIONAL_SUPPORT
|
| 19 | +#elif __has_include(<experimental/optional>) |
| 20 | +#define MODERN_SQLITE_EXPERIMENTAL_OPTIONAL_SUPPORT |
19 | 21 | #endif
|
20 | 22 | #endif
|
21 | 23 |
|
|
29 | 31 | #include <optional>
|
30 | 32 | #endif
|
31 | 33 |
|
| 34 | +#ifdef MODERN_SQLITE_EXPERIMENTAL_OPTIONAL_SUPPORT |
| 35 | +#include <experimental/optional> |
| 36 | +#define MODERN_SQLITE_STD_OPTIONAL_SUPPORT |
| 37 | +#endif |
| 38 | + |
32 | 39 | #ifdef _MODERN_SQLITE_BOOST_OPTIONAL_SUPPORT
|
33 | 40 | #include <boost/optional.hpp>
|
34 | 41 | #endif
|
|
44 | 51 | #endif
|
45 | 52 |
|
46 | 53 | namespace sqlite {
|
| 54 | + |
| 55 | + // std::optional support for NULL values |
| 56 | + #ifdef MODERN_SQLITE_STD_OPTIONAL_SUPPORT |
| 57 | + #ifdef MODERN_SQLITE_EXPERIMENTAL_OPTIONAL_SUPPORT |
| 58 | + template<class T> |
| 59 | + using optional = std::experimental::optional<T>; |
| 60 | + #else |
| 61 | + template<class T> |
| 62 | + using optional = std::optional<T>; |
| 63 | + #endif |
| 64 | + #endif |
| 65 | + |
47 | 66 | class database;
|
48 | 67 | class database_binder;
|
49 | 68 |
|
@@ -238,8 +257,8 @@ namespace sqlite {
|
238 | 257 |
|
239 | 258 |
|
240 | 259 | #ifdef MODERN_SQLITE_STD_OPTIONAL_SUPPORT
|
241 |
| - template <typename OptionalT> friend database_binder& operator <<(database_binder& db, const std::optional<OptionalT>& val); |
242 |
| - template <typename OptionalT> friend void get_col_from_db(database_binder& db, int inx, std::optional<OptionalT>& o); |
| 260 | + template <typename OptionalT> friend database_binder& operator <<(database_binder& db, const optional<OptionalT>& val); |
| 261 | + template <typename OptionalT> friend void get_col_from_db(database_binder& db, int inx, optional<OptionalT>& o); |
243 | 262 | #endif
|
244 | 263 |
|
245 | 264 | #ifdef _MODERN_SQLITE_BOOST_OPTIONAL_SUPPORT
|
@@ -790,32 +809,40 @@ namespace sqlite {
|
790 | 809 |
|
791 | 810 | // std::optional support for NULL values
|
792 | 811 | #ifdef MODERN_SQLITE_STD_OPTIONAL_SUPPORT
|
793 |
| - template <typename OptionalT> inline database_binder& operator <<(database_binder& db, const std::optional<OptionalT>& val) { |
| 812 | + template <typename OptionalT> inline database_binder& operator <<(database_binder& db, const optional<OptionalT>& val) { |
794 | 813 | if(val) {
|
795 | 814 | return db << std::move(*val);
|
796 | 815 | } else {
|
797 | 816 | return db << nullptr;
|
798 | 817 | }
|
799 | 818 | }
|
800 |
| - template <typename OptionalT> inline void store_result_in_db(sqlite3_context* db, const std::optional<OptionalT>& val) { |
| 819 | + template <typename OptionalT> inline void store_result_in_db(sqlite3_context* db, const optional<OptionalT>& val) { |
801 | 820 | if(val) {
|
802 | 821 | store_result_in_db(db, *val);
|
803 | 822 | }
|
804 | 823 | sqlite3_result_null(db);
|
805 | 824 | }
|
806 | 825 |
|
807 |
| - template <typename OptionalT> inline void get_col_from_db(database_binder& db, int inx, std::optional<OptionalT>& o) { |
| 826 | + template <typename OptionalT> inline void get_col_from_db(database_binder& db, int inx, optional<OptionalT>& o) { |
808 | 827 | if(sqlite3_column_type(db._stmt.get(), inx) == SQLITE_NULL) {
|
| 828 | + #ifdef MODERN_SQLITE_EXPERIMENTAL_OPTIONAL_SUPPORT |
| 829 | + o = std::experimental::nullopt; |
| 830 | + #else |
809 | 831 | o.reset();
|
| 832 | + #endif |
810 | 833 | } else {
|
811 | 834 | OptionalT v;
|
812 | 835 | get_col_from_db(db, inx, v);
|
813 | 836 | o = std::move(v);
|
814 | 837 | }
|
815 | 838 | }
|
816 |
| - template <typename OptionalT> inline void get_val_from_db(sqlite3_value *value, std::optional<OptionalT>& o) { |
| 839 | + template <typename OptionalT> inline void get_val_from_db(sqlite3_value *value, optional<OptionalT>& o) { |
817 | 840 | if(sqlite3_value_type(value) == SQLITE_NULL) {
|
| 841 | + #ifdef MODERN_SQLITE_EXPERIMENTAL_OPTIONAL_SUPPORT |
| 842 | + o = std::experimental::nullopt; |
| 843 | + #else |
818 | 844 | o.reset();
|
| 845 | + #endif |
819 | 846 | } else {
|
820 | 847 | OptionalT v;
|
821 | 848 | get_val_from_db(value, v);
|
|
0 commit comments