60 lines
1.8 KiB
C++
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);
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
}
|