File tree Expand file tree Collapse file tree 3 files changed +32
-0
lines changed Expand file tree Collapse file tree 3 files changed +32
-0
lines changed Original file line number Diff line number Diff line change @@ -26,4 +26,5 @@ class commit_wrapper : public wrapper_base<git_commit>
2626 commit_wrapper (git_commit* commit);
2727
2828 friend class repository_wrapper ;
29+ friend class reference_wrapper ;
2930};
Original file line number Diff line number Diff line change @@ -24,4 +24,5 @@ class object_wrapper : public wrapper_base<git_object>
2424 object_wrapper (git_object* obj);
2525
2626 friend class repository_wrapper ;
27+ friend class reference_wrapper ;
2728};
Original file line number Diff line number Diff line change 11#pragma once
22
3+ #include < concepts>
34#include < string>
45
56#include < git2.h>
@@ -20,9 +21,38 @@ class reference_wrapper : public wrapper_base<git_reference>
2021 std::string short_name () const ;
2122 bool is_remote () const ;
2223
24+ template <class W >
25+ W peel () const ;
26+
2327private:
2428
2529 reference_wrapper (git_reference* ref);
2630
2731 friend class repository_wrapper ;
2832};
33+
34+ class commit_wrapper ;
35+ class object_wrapper ;
36+
37+ // TODO: add constraints on W
38+ // For now it accepts commit_wrapper and object_wrapper only
39+ template <class W >
40+ W reference_wrapper::peel () const
41+ {
42+ constexpr git_object_t obj_type = []
43+ {
44+ if constexpr (std::same_as<W, commit_wrapper>)
45+ {
46+ return GIT_OBJECT_COMMIT;
47+ }
48+ else // Default case
49+ {
50+ return GIT_OBJECT_ANY;
51+ }
52+ }();
53+
54+ using resource_type = typename W::resource_type;
55+ git_object* resource = nullptr ;
56+ throw_if_error (git_reference_peel (&resource, this ->p_resource , obj_type));
57+ return W (reinterpret_cast <resource_type*>(resource));
58+ }
You can’t perform that action at this time.
0 commit comments