mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-07-18 10:54:26 +08:00
Added smart_memmove with support of non-POD scalars (e.g. needed in SparseBlock.h).
This commit is contained in:
parent
d1c48f1606
commit
a147500dee
@ -6,6 +6,7 @@
|
|||||||
// Copyright (C) 2009 Kenneth Riddile <kfriddile@yahoo.com>
|
// Copyright (C) 2009 Kenneth Riddile <kfriddile@yahoo.com>
|
||||||
// Copyright (C) 2010 Hauke Heibel <hauke.heibel@gmail.com>
|
// Copyright (C) 2010 Hauke Heibel <hauke.heibel@gmail.com>
|
||||||
// Copyright (C) 2010 Thomas Capricelli <orzel@freehackers.org>
|
// Copyright (C) 2010 Thomas Capricelli <orzel@freehackers.org>
|
||||||
|
// Copyright (C) 2013 Pavel Holoborodko <pavel@holoborodko.com>
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
@ -514,6 +515,34 @@ template<typename T> struct smart_copy_helper<T,false> {
|
|||||||
{ std::copy(start, end, target); }
|
{ std::copy(start, end, target); }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// intelligent memmove. falls back to std::memmove for POD types, uses std::copy otherwise.
|
||||||
|
template<typename T, bool UseMemmove> struct smart_memmove_helper;
|
||||||
|
|
||||||
|
template<typename T> void smart_memmove(const T* start, const T* end, T* target)
|
||||||
|
{
|
||||||
|
smart_memmove_helper<T,!NumTraits<T>::RequireInitialization>::run(start, end, target);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T> struct smart_memmove_helper<T,true> {
|
||||||
|
static inline void run(const T* start, const T* end, T* target)
|
||||||
|
{ std::memmove(target, start, std::ptrdiff_t(end)-std::ptrdiff_t(start)); }
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename T> struct smart_memmove_helper<T,false> {
|
||||||
|
static inline void run(const T* start, const T* end, T* target)
|
||||||
|
{
|
||||||
|
if (uintptr_t(target) < uintptr_t(start))
|
||||||
|
{
|
||||||
|
std::copy(start, end, target);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
std::ptrdiff_t count = (std::ptrdiff_t(end)-std::ptrdiff_t(start)) / sizeof(T);
|
||||||
|
std::copy_backward(start, end, target + count);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
*** Implementation of runtime stack allocation (falling back to malloc) ***
|
*** Implementation of runtime stack allocation (falling back to malloc) ***
|
||||||
|
Loading…
x
Reference in New Issue
Block a user