Files
jeanlemotan 8297b0b45f First
2024-07-02 18:06:33 +02:00

60 lines
1.8 KiB
C++

#pragma once
#include "tl/detail/prologue.h"
#include "tl/type_traits.h"
#include <iterator>
#include <type_traits>
#include <forward_list>
namespace tl
{
namespace detail
{
//////////////////////////////////////////////////////////////////////////
// associative containers (ordered & unordered) [maps, unordered_maps, multimaps, unordered_multimaps ...]
template <typename SrcContainer, typename DstContainer>
void append(std::true_type, DstContainer& dst, const SrcContainer& src) noexcept
{
dst.insert(std::begin(src), std::end(src));
}
//////////////////////////////////////////////////////////////////////////
// sequence containers [vector, dequeue, forward_list, list, ...]
template <typename SrcContainer, typename DstContainer>
void append(std::false_type, DstContainer& dst, const SrcContainer& src) noexcept
{
dst.insert(std::end(dst), std::begin(src), std::end(src));
}
//////////////////////////////////////////////////////////////////////////
// Obs: std::forward_list don't support fast traversal to the end
// thus going to std::prev(std::end(dst)) must be done manually
// Cost: O(N)
template <typename T, typename SrcContainer>
void append(std::false_type, std::forward_list<T>& dst, const SrcContainer& src) noexcept
{
auto before_end = dst.before_begin();
for (auto& _ : dst)
++before_end;
dst.insert_after(before_end, std::begin(src), std::end(src));
}
//////////////////////////////////////////////////////////////////////////
} // namespace detail
//////////////////////////////////////////////////////////////////////////
template <typename SrcContainer, typename DstContainer>
void append(DstContainer& dst, const SrcContainer& src) noexcept
{
detail::append(tl::is_associative_container<DstContainer>{}, dst, src);
}
//////////////////////////////////////////////////////////////////////////
}