//======================================================================= // Copyright Baptiste Wicht 2013-2016. // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) //======================================================================= #ifndef ALGORITHMS_H #define ALGORITHMS_H #include #include #include #include namespace std { template void copy(OutputIterator out, InputIterator it, InputIterator end){ if(it != end){ *out = *it; while(++it != end){ *++out = *it; } } } template::value_type>::value, int> = 42> void copy_n(OutputIterator out, InputIterator in, size_t n){ if(n > 0){ *out = *in; while(--n){ *++out = *++in; } } } inline void memcpy(char* out, const char* in, size_t bytes){ if(!bytes){ return; } // Copy as much as possible 64 bits at at time if(bytes >= 8){ auto* out64 = reinterpret_cast(out); auto* in64 = reinterpret_cast(in); size_t l = 1 + bytes / 8; while(--l){ *out64++ = *in64++; } bytes -= l * 8; } // Finish up byte by byte while(bytes >= 1){ *out++ = *in++; --bytes; } } template::value_type>::value, int> = 42> void copy_n(OutputIterator out, InputIterator in, size_t n){ memcpy(reinterpret_cast(out), reinterpret_cast(in), n * sizeof(decltype(*out))); } template void move_n(OutputIterator out, InputIterator in, size_t n){ if(n > 0){ *out = std::move(*in); while(--n){ *++out = std::move(*++in); } } } inline void memclr(char* out, size_t bytes){ if(!bytes){ return; } // Copy as much as possible 64 bits at at time if(bytes >= 8){ auto* out64 = reinterpret_cast(out); size_t l = 1 + bytes / 8; while(--l){ *out64++ = 0; } bytes -= l * 8; } // Finish up byte by byte while(bytes >= 1){ *out++ = 0; --bytes; } } template void fill(ForwardIterator it, ForwardIterator end, const T& value){ if(it != end){ *it = value; while(++it != end){ *it = value; } } } template::value_type>::value, int> = 42> void fill_n(ForwardIterator it, size_t n, const T& value){ if(n > 0){ *it = value; while(--n){ *++it = value; } } } template::value_type>::value, int> = 42> void fill_n(ForwardIterator it, size_t n, const T& value){ if(!value){ memclr(reinterpret_cast(it), n * sizeof(decltype(*it))); } else { if(n > 0){ *it = value; while(--n){ *++it = value; } } } } template size_t compare_n(Iterator1 it1, Iterator2 it2, size_t n){ if(n > 0){ while(n--){ if(*it1 != *it2){ return *it1- *it2; } else { ++it1; ++it2; } } } return 0; } template bool equal_n(Iterator1 it1, Iterator2 it2, size_t n){ return compare_n(it1, it2, n) == 0; } template constexpr const T& min(const T& a, const T& b){ return a <= b ? a : b; } template constexpr const T& max(const T& a, const T& b){ return a >= b ? a : b; } } //end of namespace std #endif