First
This commit is contained in:
@@ -0,0 +1,59 @@
|
||||
#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);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user