Skip to content

Commit 7eaf518

Browse files
committed
Implemented std::experimental optional and consolidated the different optional implementations
1 parent 4981e55 commit 7eaf518

File tree

1 file changed

+22
-56
lines changed

1 file changed

+22
-56
lines changed

hdr/sqlite_modern_cpp.h

Lines changed: 22 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,20 @@
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

Comments
 (0)