diff --git a/src/wrapper/commit_wrapper.hpp b/src/wrapper/commit_wrapper.hpp index d7930d9..0560007 100644 --- a/src/wrapper/commit_wrapper.hpp +++ b/src/wrapper/commit_wrapper.hpp @@ -26,4 +26,5 @@ class commit_wrapper : public wrapper_base commit_wrapper(git_commit* commit); friend class repository_wrapper; + friend class reference_wrapper; }; diff --git a/src/wrapper/object_wrapper.hpp b/src/wrapper/object_wrapper.hpp index bceab14..d839ade 100644 --- a/src/wrapper/object_wrapper.hpp +++ b/src/wrapper/object_wrapper.hpp @@ -24,4 +24,5 @@ class object_wrapper : public wrapper_base object_wrapper(git_object* obj); friend class repository_wrapper; + friend class reference_wrapper; }; diff --git a/src/wrapper/refs_wrapper.hpp b/src/wrapper/refs_wrapper.hpp index 2ad4b21..c0ff534 100644 --- a/src/wrapper/refs_wrapper.hpp +++ b/src/wrapper/refs_wrapper.hpp @@ -1,5 +1,6 @@ #pragma once +#include #include #include @@ -20,9 +21,38 @@ class reference_wrapper : public wrapper_base std::string short_name() const; bool is_remote() const; + template + W peel() const; + private: reference_wrapper(git_reference* ref); friend class repository_wrapper; }; + +class commit_wrapper; +class object_wrapper; + +// TODO: add constraints on W +// For now it accepts commit_wrapper and object_wrapper only +template +W reference_wrapper::peel() const +{ + constexpr git_object_t obj_type = [] + { + if constexpr (std::same_as) + { + return GIT_OBJECT_COMMIT; + } + else // Default case + { + return GIT_OBJECT_ANY; + } + }(); + + using resource_type = typename W::resoure_type; + git_object* resource = nullptr; + throw_if_error(git_reference_peel(&resource, this->p_resource, obj_type)); + return W(reinterpret_cast(resource)); +}