Skip to content

Commit 21a4716

Browse files
authored
Merge pull request #135 from cbeiraod/master
Adding std::experimental::optional
2 parents 3c43aa3 + 4fa9351 commit 21a4716

File tree

3 files changed

+37
-8
lines changed

3 files changed

+37
-8
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,8 @@ int main() {
325325
326326
If you do not have C++17 support, you can use boost optional instead by defining `_MODERN_SQLITE_BOOST_OPTIONAL_SUPPORT` before importing the `sqlite_modern_cpp` header.
327327
328+
If the optional library is not available, the experimental/optional one will be used instead.
329+
328330
**Note: boost support is deprecated and will be removed in future versions.**
329331
330332
Variant type support (C++17)

hdr/sqlite_modern_cpp.h

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
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+
#define MODERN_SQLITE_EXPERIMENTAL_OPTIONAL_SUPPORT
1921
#endif
2022
#endif
2123

@@ -29,6 +31,11 @@
2931
#include <optional>
3032
#endif
3133

34+
#ifdef MODERN_SQLITE_EXPERIMENTAL_OPTIONAL_SUPPORT
35+
#include <experimental/optional>
36+
#define MODERN_SQLITE_STD_OPTIONAL_SUPPORT
37+
#endif
38+
3239
#ifdef _MODERN_SQLITE_BOOST_OPTIONAL_SUPPORT
3340
#include <boost/optional.hpp>
3441
#endif
@@ -44,6 +51,18 @@
4451
#endif
4552

4653
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+
4766
class database;
4867
class database_binder;
4968

@@ -238,8 +257,8 @@ namespace sqlite {
238257

239258

240259
#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);
243262
#endif
244263

245264
#ifdef _MODERN_SQLITE_BOOST_OPTIONAL_SUPPORT
@@ -790,32 +809,40 @@ namespace sqlite {
790809

791810
// std::optional support for NULL values
792811
#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) {
794813
if(val) {
795814
return db << std::move(*val);
796815
} else {
797816
return db << nullptr;
798817
}
799818
}
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) {
801820
if(val) {
802821
store_result_in_db(db, *val);
803822
}
804823
sqlite3_result_null(db);
805824
}
806825

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) {
808827
if(sqlite3_column_type(db._stmt.get(), inx) == SQLITE_NULL) {
828+
#ifdef MODERN_SQLITE_EXPERIMENTAL_OPTIONAL_SUPPORT
829+
o = std::experimental::nullopt;
830+
#else
809831
o.reset();
832+
#endif
810833
} else {
811834
OptionalT v;
812835
get_col_from_db(db, inx, v);
813836
o = std::move(v);
814837
}
815838
}
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) {
817840
if(sqlite3_value_type(value) == SQLITE_NULL) {
841+
#ifdef MODERN_SQLITE_EXPERIMENTAL_OPTIONAL_SUPPORT
842+
o = std::experimental::nullopt;
843+
#else
818844
o.reset();
845+
#endif
819846
} else {
820847
OptionalT v;
821848
get_val_from_db(value, v);

tests/std_optional.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,15 @@ using namespace std;
88
#ifdef MODERN_SQLITE_STD_OPTIONAL_SUPPORT
99
void insert(database& db, bool is_null) {
1010
int id = 1;
11-
std::optional<int> val;
11+
sqlite::optional<int> val;
1212
if(!is_null) val = 5;
1313

1414
db << "delete from test where id = 1";
1515
db << "insert into test(id,val) values(?,?)" << id << val;
1616
}
1717

1818
void select(database& db, bool should_be_null) {
19-
db << "select id,val from test" >> [&](long long, std::optional<int> val) {
19+
db << "select id,val from test" >> [&](long long, sqlite::optional<int> val) {
2020
if(should_be_null) {
2121
if(val) exit(EXIT_FAILURE);
2222
} else {

0 commit comments

Comments
 (0)