Skip to content

Commit 30ec3e5

Browse files
committed
replace all specialized function templates with nontemplate functions and add them to be friends of class database_binder
1 parent 186d087 commit 30ec3e5

File tree

1 file changed

+25
-13
lines changed

1 file changed

+25
-13
lines changed

hdr/sqlite_modern_cpp.h

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,19 @@ namespace sqlite {
223223
template<typename T> friend database_binder& operator <<(database_binder& db, const std::unique_ptr<T>& val);
224224
template<typename T> friend void get_col_from_db(database_binder& db, int inx, std::unique_ptr<T>& val);
225225
template<typename T> friend T operator++(database_binder& db, int);
226+
// for nontemplate functions
227+
friend database_binder& operator<<(database_binder& db, const int& val);
228+
friend void get_col_from_db(database_binder& db, int inx, int& val);
229+
friend database_binder& operator <<(database_binder& db, const sqlite_int64& val);
230+
friend void get_col_from_db(database_binder& db, int inx, sqlite3_int64& i);
231+
friend database_binder& operator <<(database_binder& db, const float& val);
232+
friend void get_col_from_db(database_binder& db, int inx, float& f);
233+
friend database_binder& operator <<(database_binder& db, const double& val);
234+
friend void get_col_from_db(database_binder& db, int inx, double& d);
235+
friend void get_col_from_db(database_binder& db, int inx, std::string & s);
236+
friend database_binder& operator <<(database_binder& db, const std::string& txt);
237+
friend void get_col_from_db(database_binder& db, int inx, std::u16string & w);
238+
friend database_binder& operator <<(database_binder& db, const std::u16string& txt);
226239

227240

228241
#ifdef _MODERN_SQLITE_BOOST_OPTIONAL_SUPPORT
@@ -350,7 +363,6 @@ namespace sqlite {
350363
Values&&... values
351364
) {
352365
nth_argument_type<Function, sizeof...(Values)> value{};
353-
get_col_from_db(db, sizeof...(Values), value);
354366

355367
run<Function>(db, function, std::forward<Values>(values)..., std::move(value));
356368
}
@@ -370,15 +382,15 @@ namespace sqlite {
370382
};
371383

372384
// int
373-
template<> inline database_binder& operator<<(database_binder& db, const int& val) {
385+
inline database_binder& operator<<(database_binder& db, const int& val) {
374386
int hresult;
375387
if((hresult = sqlite3_bind_int(db._stmt.get(), db._inx, val)) != SQLITE_OK) {
376388
exceptions::throw_sqlite_error(hresult);
377389
}
378390
++db._inx;
379391
return db;
380392
}
381-
template<> inline void get_col_from_db(database_binder& db, int inx, int& val) {
393+
inline void get_col_from_db(database_binder& db, int inx, int& val) {
382394
if(sqlite3_column_type(db._stmt.get(), inx) == SQLITE_NULL) {
383395
val = 0;
384396
} else {
@@ -387,7 +399,7 @@ namespace sqlite {
387399
}
388400

389401
// sqlite_int64
390-
template<> inline database_binder& operator <<(database_binder& db, const sqlite_int64& val) {
402+
inline database_binder& operator <<(database_binder& db, const sqlite_int64& val) {
391403
int hresult;
392404
if((hresult = sqlite3_bind_int64(db._stmt.get(), db._inx, val)) != SQLITE_OK) {
393405
exceptions::throw_sqlite_error(hresult);
@@ -396,7 +408,7 @@ namespace sqlite {
396408
++db._inx;
397409
return db;
398410
}
399-
template<> inline void get_col_from_db(database_binder& db, int inx, sqlite3_int64& i) {
411+
inline void get_col_from_db(database_binder& db, int inx, sqlite3_int64& i) {
400412
if(sqlite3_column_type(db._stmt.get(), inx) == SQLITE_NULL) {
401413
i = 0;
402414
} else {
@@ -405,7 +417,7 @@ namespace sqlite {
405417
}
406418

407419
// float
408-
template<> inline database_binder& operator <<(database_binder& db, const float& val) {
420+
inline database_binder& operator <<(database_binder& db, const float& val) {
409421
int hresult;
410422
if((hresult = sqlite3_bind_double(db._stmt.get(), db._inx, double(val))) != SQLITE_OK) {
411423
exceptions::throw_sqlite_error(hresult);
@@ -414,7 +426,7 @@ namespace sqlite {
414426
++db._inx;
415427
return db;
416428
}
417-
template<> inline void get_col_from_db(database_binder& db, int inx, float& f) {
429+
inline void get_col_from_db(database_binder& db, int inx, float& f) {
418430
if(sqlite3_column_type(db._stmt.get(), inx) == SQLITE_NULL) {
419431
f = 0;
420432
} else {
@@ -423,7 +435,7 @@ namespace sqlite {
423435
}
424436

425437
// double
426-
template<> inline database_binder& operator <<(database_binder& db, const double& val) {
438+
inline database_binder& operator <<(database_binder& db, const double& val) {
427439
int hresult;
428440
if((hresult = sqlite3_bind_double(db._stmt.get(), db._inx, val)) != SQLITE_OK) {
429441
exceptions::throw_sqlite_error(hresult);
@@ -432,7 +444,7 @@ namespace sqlite {
432444
++db._inx;
433445
return db;
434446
}
435-
template<> inline void get_col_from_db(database_binder& db, int inx, double& d) {
447+
inline void get_col_from_db(database_binder& db, int inx, double& d) {
436448
if(sqlite3_column_type(db._stmt.get(), inx) == SQLITE_NULL) {
437449
d = 0;
438450
} else {
@@ -491,7 +503,7 @@ namespace sqlite {
491503
}
492504

493505
// std::string
494-
template<> inline void get_col_from_db(database_binder& db, int inx, std::string & s) {
506+
inline void get_col_from_db(database_binder& db, int inx, std::string & s) {
495507
if(sqlite3_column_type(db._stmt.get(), inx) == SQLITE_NULL) {
496508
s = std::string();
497509
} else {
@@ -504,7 +516,7 @@ namespace sqlite {
504516
template<std::size_t N> inline database_binder& operator <<(database_binder& db, const char(&STR)[N]) { return db << std::string(STR); }
505517
template<std::size_t N> inline database_binder& operator <<(database_binder& db, const char16_t(&STR)[N]) { return db << std::u16string(STR); }
506518

507-
template<> inline database_binder& operator <<(database_binder& db, const std::string& txt) {
519+
inline database_binder& operator <<(database_binder& db, const std::string& txt) {
508520
int hresult;
509521
if((hresult = sqlite3_bind_text(db._stmt.get(), db._inx, txt.data(), -1, SQLITE_TRANSIENT)) != SQLITE_OK) {
510522
exceptions::throw_sqlite_error(hresult);
@@ -514,7 +526,7 @@ namespace sqlite {
514526
return db;
515527
}
516528
// std::u16string
517-
template<> inline void get_col_from_db(database_binder& db, int inx, std::u16string & w) {
529+
inline void get_col_from_db(database_binder& db, int inx, std::u16string & w) {
518530
if(sqlite3_column_type(db._stmt.get(), inx) == SQLITE_NULL) {
519531
w = std::u16string();
520532
} else {
@@ -524,7 +536,7 @@ namespace sqlite {
524536
}
525537

526538

527-
template<> inline database_binder& operator <<(database_binder& db, const std::u16string& txt) {
539+
inline database_binder& operator <<(database_binder& db, const std::u16string& txt) {
528540
int hresult;
529541
if((hresult = sqlite3_bind_text16(db._stmt.get(), db._inx, txt.data(), -1, SQLITE_TRANSIENT)) != SQLITE_OK) {
530542
exceptions::throw_sqlite_error(hresult);

0 commit comments

Comments
 (0)