#pragma once #include "cxx-llvm-auto/cxx/include/cxx-llvm-auto.hxx" #include "llvm/ADT/SmallVector.h" namespace cxx_llvm::llvm::adt::small_vector_boxed { template class SmallVectorBoxed { private: ::std::unique_ptr m_ptr; ::llvm::SmallVectorImpl* m_impl; template static auto erase(::llvm::SmallVector* ptr) -> ::std::unique_ptr { return ::std::unique_ptr(static_cast(ptr), [](void* ptr) { // NOLINTNEXTLINE(cppcoreguidelines-owning-memory) delete static_cast<::llvm::SmallVector*>(ptr); }); } template explicit SmallVectorBoxed(std::unique_ptr<::llvm::SmallVector> ptr) noexcept : m_ptr{ erase(ptr.release()) } , m_impl{ static_cast<::llvm::SmallVectorImpl*>(m_ptr.get()) } { } public: template explicit SmallVectorBoxed(::llvm::SmallVector&& vec) noexcept : SmallVectorBoxed{ ::std::make_unique<::llvm::SmallVector>(::std::move(vec)) } { } SmallVectorBoxed(SmallVectorBoxed const&) = delete; SmallVectorBoxed(SmallVectorBoxed&&) noexcept = default; ~SmallVectorBoxed() noexcept = default; auto operator=(SmallVectorBoxed const&) -> SmallVectorBoxed& = delete; auto operator=(SmallVectorBoxed&&) noexcept -> SmallVectorBoxed& = default; auto as_ref_small_vector_impl() const& noexcept -> ::llvm::SmallVectorImpl const& { return *m_impl; } auto as_pin_small_vector_impl() & noexcept -> ::llvm::SmallVectorImpl& { return *m_impl; } }; } // namespace cxx_llvm::llvm::adt::small_vector_boxed namespace cxx_llvm::llvm::adt::small_vector_boxed { template using TyCon = SmallVectorBoxed; } // namespace cxx_llvm::llvm::adt::small_vector_boxed