diff options
Diffstat (limited to 'bpkg/database')
-rw-r--r-- | bpkg/database | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/bpkg/database b/bpkg/database index 05ffb04..f7de4d5 100644 --- a/bpkg/database +++ b/bpkg/database @@ -5,6 +5,9 @@ #ifndef BPKG_DATABASE #define BPKG_DATABASE +#include <utility> // forward() + +#include <odb/session.hxx> #include <odb/sqlite/database.hxx> #include <bpkg/types> @@ -12,6 +15,8 @@ namespace bpkg { + using odb::session; + using odb::sqlite::database; using odb::sqlite::transaction; @@ -28,6 +33,43 @@ namespace bpkg database& db_; odb::tracer* t_; }; + + // Range-based for-loop iteration over query result that returns + // object pointers. For example: + // + // for (shared_ptr<object> o: pointer_result (db.query<object> (...))) + // + template <typename R> + class pointer_result_range + { + R r_; + + public: + pointer_result_range (R&& r): r_ (std::forward<R> (r)) {} + + using base_iterator = typename R::iterator; + + struct iterator: base_iterator + { + iterator () = default; + + explicit + iterator (base_iterator i): base_iterator (std::move (i)) {} + + typename base_iterator::pointer_type + operator* () {return this->load ();} + }; + + iterator begin () {return iterator (r_.begin ());} + iterator end () {return iterator (r_.end ());} + }; + + template <typename R> + inline pointer_result_range<R> + pointer_result (R&& r) + { + return pointer_result_range<R> (std::forward<R> (r)); + } } #endif // BPKG_DATABASE |