#pragma once #include #include #include #include "../utils/git_exception.hpp" #include "../wrapper/object_wrapper.hpp" #include "../wrapper/wrapper_base.hpp" class reference_wrapper : public wrapper_base { public: using base_type = wrapper_base; ~reference_wrapper(); reference_wrapper(reference_wrapper&&) noexcept = default; reference_wrapper& operator=(reference_wrapper&&) noexcept = default; std::string short_name() const; bool is_remote() const; const git_oid* target() const; reference_wrapper write_new_ref(const git_oid target_oid); 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::resource_type; git_object* resource = nullptr; throw_if_error(git_reference_peel(&resource, this->p_resource, obj_type)); return W(reinterpret_cast(resource)); }