#ifndef PACKINGCONTEXT_HPP #define PACKINGCONTEXT_HPP #include "ArrangeItemTraits.hpp" namespace Slic3r { namespace arr2 { template struct PackingContextTraits_ { template static void add_fixed_item(Ctx &ctx, const ArrItem &itm) { ctx.add_fixed_item(itm); } template static void add_packed_item(Ctx &ctx, ArrItem &itm) { ctx.add_packed_item(itm); } // returns a range of all packed items in the context ctx static auto all_items_range(const Ctx &ctx) { return ctx.all_items_range(); } static auto fixed_items_range(const Ctx &ctx) { return ctx.fixed_items_range(); } static auto packed_items_range(const Ctx &ctx) { return ctx.packed_items_range(); } static auto packed_items_range(Ctx &ctx) { return ctx.packed_items_range(); } }; template void add_fixed_item(Ctx &ctx, const ArrItem &itm) { PackingContextTraits_>::add_fixed_item(ctx, itm); } template void add_packed_item(Ctx &ctx, ArrItem &itm) { PackingContextTraits_>::add_packed_item(ctx, itm); } template auto all_items_range(const Ctx &ctx) { return PackingContextTraits_>::all_items_range(ctx); } template auto fixed_items_range(const Ctx &ctx) { return PackingContextTraits_>::fixed_items_range(ctx); } template auto packed_items_range(Ctx &&ctx) { return PackingContextTraits_>::packed_items_range(ctx); } template class DefaultPackingContext { using ArrItemRaw = StripCVRef; std::vector> m_fixed; std::vector> m_packed; std::vector> m_items; public: DefaultPackingContext() = default; template explicit DefaultPackingContext(const Range &fixed_items) { std::copy(fixed_items.begin(), fixed_items.end(), std::back_inserter(m_fixed)); std::copy(fixed_items.begin(), fixed_items.end(), std::back_inserter(m_items)); } auto all_items_range() const noexcept { return crange(m_items); } auto fixed_items_range() const noexcept { return crange(m_fixed); } auto packed_items_range() const noexcept { return crange(m_packed); } auto packed_items_range() noexcept { return range(m_packed); } void add_fixed_item(const ArrItem &itm) { m_fixed.emplace_back(itm); m_items.emplace_back(itm); } void add_packed_item(ArrItem &itm) { m_packed.emplace_back(itm); m_items.emplace_back(itm); } }; template auto default_context(const Range &items) { using ArrItem = StripCVRef::value_type>; return DefaultPackingContext{items}; } template auto default_context(const Cont &container) { return DefaultPackingContext{crange(container)}; } }} // namespace Slic3r::arr2 #endif // PACKINGCONTEXT_HPP