Compare commits

...

8 Commits

Author SHA1 Message Date
9dc04a60f4 Rework as esp-idf component 2023-11-23 17:17:05 +01:00
e4d4a685da Fix MSVC warnings in tests
MSVC complains about narrowing conversions and unreferences parameters.
This makes all tests almost level 4 warning clean on MSVC 14.
2022-12-30 23:02:32 +01:00
7d8a063d35 Merge pull request #110 from Morwenn/patch-1
Fix links to The Old New Thing
2022-11-07 08:28:29 -08:00
0666c4ce35 Fix links to The Old New Thing
Blogs moved from https://blogs.msdn.microsoft.com to https://devblogs.microsoft.com
2022-11-07 16:44:05 +01:00
6f4d74c6bb Merge pull request #108 from denzor200/denzor200-patch-1
Add forgotten `inline` for `is_palindrome`
2022-10-12 07:39:41 -07:00
6d58f2b9d1 Update is_palindrome.hpp 2022-10-12 19:53:19 +06:00
6a5ca4e89c Merge pull request #107 from fanquake/use_core_enable_if
refactor: use core/enable_if over utility/enable_if
2022-08-30 21:47:33 -07:00
e8ba63c4ad refactor: use core/enable_if over utility/enable_if 2022-08-30 17:28:54 +01:00
18 changed files with 72 additions and 40 deletions

View File

@ -3,6 +3,8 @@
# Distributed under the Boost Software License, Version 1.0.
# https://www.boost.org/LICENSE_1_0.txt
if(NOT DEFINED IDF_TARGET)
cmake_minimum_required(VERSION 3.5...3.16)
project(boost_algorithm VERSION "${BOOST_SUPERPROJECT_VERSION}" LANGUAGES CXX)
@ -39,3 +41,33 @@ if(BUILD_TESTING AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/test/CMakeLists.txt")
endif()
else()
FILE(GLOB_RECURSE headers include/*.h include/*.hpp)
idf_component_register(
SRCS
${headers}
INCLUDE_DIRS
include
REQUIRES
boost_array
boost_assert
boost_bind
boost_concept_check
boost_config
boost_core
boost_exception
boost_function
boost_iterator
boost_mpl
boost_range
boost_regex
boost_static_assert
boost_throw_exception
boost_tuple
boost_type_traits
boost_unordered
)
endif()

View File

@ -16,12 +16,12 @@ The routine `apply_permutation` takes a item sequence and a order sequence. It r
The routine `apply_reverse_permutation` takes a item sequence and a order sequence. It will reshuffle item sequence according to order sequence. Every value in order sequence means where the item goes to. Order sequence needs to be exactly a permutation of the sequence [0, 1, ... , N], where N is the biggest index in the item sequence (zero-indexed).
Implementations are based on these articles:
https://blogs.msdn.microsoft.com/oldnewthing/20170102-00/?p=95095
https://blogs.msdn.microsoft.com/oldnewthing/20170103-00/?p=95105
https://blogs.msdn.microsoft.com/oldnewthing/20170104-00/?p=95115
https://blogs.msdn.microsoft.com/oldnewthing/20170109-00/?p=95145
https://blogs.msdn.microsoft.com/oldnewthing/20170110-00/?p=95155
https://blogs.msdn.microsoft.com/oldnewthing/20170111-00/?p=95165
https://devblogs.microsoft.com/oldnewthing/20170102-00/?p=95095
https://devblogs.microsoft.com/oldnewthing/20170103-00/?p=95105
https://devblogs.microsoft.com/oldnewthing/20170104-00/?p=95115
https://devblogs.microsoft.com/oldnewthing/20170109-00/?p=95145
https://devblogs.microsoft.com/oldnewthing/20170110-00/?p=95155
https://devblogs.microsoft.com/oldnewthing/20170111-00/?p=95165
The routines come in 2 forms; the first one takes two iterators to define the item range and one iterator to define the beginning of index range. The second form takes range to define the item sequence and range to define index sequence.

View File

@ -20,7 +20,7 @@
#include <functional> // for plus and multiplies
#include <boost/config.hpp>
#include <boost/utility/enable_if.hpp> // for boost::disable_if
#include <boost/core/enable_if.hpp> // for boost::disable_if
#include <boost/type_traits/is_integral.hpp>
namespace boost { namespace algorithm {

View File

@ -27,7 +27,7 @@
#include <boost/range/begin.hpp>
#include <boost/range/end.hpp>
#include <boost/type_traits/type_identity.hpp> // for boost::type_identity
#include <boost/utility/enable_if.hpp> // for boost::disable_if
#include <boost/core/enable_if.hpp> // for boost::disable_if
namespace boost { namespace algorithm {

View File

@ -20,7 +20,7 @@
#include <boost/config.hpp>
#include <boost/range/begin.hpp>
#include <boost/range/end.hpp>
#include <boost/utility/enable_if.hpp>
#include <boost/core/enable_if.hpp>
#include <boost/type_traits/is_same.hpp>
namespace boost { namespace algorithm {

View File

@ -20,7 +20,7 @@
#include <boost/range/begin.hpp>
#include <boost/range/end.hpp>
#include <boost/utility/enable_if.hpp>
#include <boost/core/enable_if.hpp>
#include <boost/type_traits/is_same.hpp>
#include <boost/type_traits/type_identity.hpp> // for boost::type_identity

View File

@ -30,7 +30,7 @@
#include <boost/exception/info.hpp>
#include <boost/throw_exception.hpp>
#include <boost/utility/enable_if.hpp>
#include <boost/core/enable_if.hpp>
#include <boost/type_traits/is_integral.hpp>

View File

@ -113,7 +113,7 @@ bool is_palindrome(const R& range, Predicate p)
/// \note This function will return true for empty sequences and for palindromes.
/// For other sequences function will return false.
/// Complexity: O(N).
bool is_palindrome(const char* str)
inline bool is_palindrome(const char* str)
{
if(!str)
return true;

View File

@ -19,7 +19,7 @@
#include <boost/range/begin.hpp>
#include <boost/range/end.hpp>
#include <boost/utility/enable_if.hpp>
#include <boost/core/enable_if.hpp>
#include <boost/type_traits/is_same.hpp>
#include <boost/algorithm/searching/detail/bm_traits.hpp>

View File

@ -19,7 +19,7 @@
#include <boost/range/begin.hpp>
#include <boost/range/end.hpp>
#include <boost/utility/enable_if.hpp>
#include <boost/core/enable_if.hpp>
#include <boost/type_traits/is_same.hpp>
#include <boost/algorithm/searching/detail/bm_traits.hpp>

View File

@ -20,7 +20,7 @@
#include <boost/range/begin.hpp>
#include <boost/range/end.hpp>
#include <boost/utility/enable_if.hpp>
#include <boost/core/enable_if.hpp>
#include <boost/type_traits/is_same.hpp>
#include <boost/algorithm/searching/detail/debugging.hpp>

View File

@ -28,8 +28,8 @@
namespace ba = boost::algorithm;
// namespace ba = boost;
BOOST_CXX14_CONSTEXPR bool is_true ( int v ) { return true; }
BOOST_CXX14_CONSTEXPR bool is_false ( int v ) { return false; }
BOOST_CXX14_CONSTEXPR bool is_true ( int ) { return true; }
BOOST_CXX14_CONSTEXPR bool is_false ( int ) { return false; }
BOOST_CXX14_CONSTEXPR bool is_even ( int v ) { return v % 2 == 0; }
BOOST_CXX14_CONSTEXPR bool is_odd ( int v ) { return v % 2 == 1; }
BOOST_CXX14_CONSTEXPR bool is_zero ( int v ) { return v == 0; }

View File

@ -25,7 +25,7 @@ void test_short_input1 () {
std::string s;
try { ba::unhex ( std::string ( "A" ), std::back_inserter(s)); }
catch ( const std::exception &ex ) { return; }
catch ( const std::exception & ) { return; }
BOOST_TEST_MESSAGE ( "Failed to catch std::exception in test_short_input1" );
BOOST_CHECK ( false );
}
@ -34,7 +34,7 @@ void test_short_input2 () {
std::string s;
try { ba::unhex ( std::string ( "A" ), std::back_inserter(s)); }
catch ( const ba::hex_decode_error &ex ) { return; }
catch ( const ba::hex_decode_error & ) { return; }
BOOST_TEST_MESSAGE ( "Failed to catch ba::hex_decode_error in test_short_input2" );
BOOST_CHECK ( false );
}
@ -43,7 +43,7 @@ void test_short_input3 () {
std::string s;
try { ba::unhex ( std::string ( "A" ), std::back_inserter(s)); }
catch ( const ba::not_enough_input &ex ) { return; }
catch ( const ba::not_enough_input & ) { return; }
BOOST_TEST_MESSAGE ( "Failed to catch ba::not_enough_input in test_short_input3" );
BOOST_CHECK ( false );
}
@ -53,8 +53,8 @@ void test_short_input4 () {
std::string s;
try { ba::unhex ( std::string ( "A" ), std::back_inserter(s)); }
catch ( const ba::non_hex_input &ex ) { BOOST_CHECK ( false ); }
catch ( const ba::not_enough_input &ex ) { return; }
catch ( const ba::non_hex_input & ) { BOOST_CHECK ( false ); }
catch ( const ba::not_enough_input & ) { return; }
catch ( ... ) { BOOST_CHECK ( false ); }
BOOST_CHECK ( false );
}
@ -64,8 +64,8 @@ void test_short_input5 () {
std::string s;
try { ba::unhex ( "A", std::back_inserter(s)); }
catch ( const ba::non_hex_input &ex ) { BOOST_CHECK ( false ); }
catch ( const ba::not_enough_input &ex ) { return; }
catch ( const ba::non_hex_input & ) { BOOST_CHECK ( false ); }
catch ( const ba::not_enough_input & ) { return; }
catch ( ... ) { BOOST_CHECK ( false ); }
BOOST_CHECK ( false );
}
@ -125,8 +125,8 @@ void test_nonhex_input4 () {
std::string s;
try { ba::unhex ( "P1234FA1234", std::back_inserter(s)); }
catch ( const ba::not_enough_input &ex ) { BOOST_CHECK ( false ); }
catch ( const ba::non_hex_input &ex ) { return; }
catch ( const ba::not_enough_input & ) { BOOST_CHECK ( false ); }
catch ( const ba::non_hex_input & ) { return; }
catch ( ... ) { BOOST_CHECK ( false ); }
BOOST_CHECK ( false );
}

View File

@ -112,7 +112,7 @@ void test_sequence1 () {
std::vector<int> v, v1;
v.clear ();
for ( std::size_t i = 5; i < 15; ++i )
for ( int i = 5; i < 15; ++i )
v.push_back ( i );
v1 = v;
BOOST_CHECK ( ba::is_permutation ( v.begin (), v.end (), v.begin ())); // better be a permutation of itself!

View File

@ -32,7 +32,7 @@ namespace {
// Check using iterators
template<typename Container>
void check_one_iter ( const Container &haystack, const std::string &needle, int expected ) {
void check_one_iter ( const Container &haystack, const std::string &needle, std::ptrdiff_t expected ) {
typedef typename Container::const_iterator iter_type;
typedef typename std::pair<iter_type, iter_type> ret_type;
typedef std::string::const_iterator pattern_type;
@ -53,7 +53,7 @@ namespace {
// iter_type it1r = ret1r.first;
// iter_type it2 = ret2.first;
// iter_type it3 = ret3.first;
const int dist = ret1.first == hEnd ? -1 : std::distance ( hBeg, ret1.first );
const std::ptrdiff_t dist = ret1.first == hEnd ? -1 : std::distance ( hBeg, ret1.first );
std::cout << "(Iterators) Pattern is " << needle.length () << ", haysstack is " << haystack.length () << " chars long; " << std::endl;
try {
@ -97,7 +97,7 @@ namespace {
// Check using pointers
// We're assuming that the container implements contiguous storage here.
template<typename Container>
void check_one_pointer ( const Container &haystack, const std::string &needle, int expected ) {
void check_one_pointer ( const Container &haystack, const std::string &needle, std::ptrdiff_t expected ) {
typedef const typename Container::value_type *ptr_type;
typedef typename std::pair<ptr_type, ptr_type> ret_type;
@ -110,7 +110,7 @@ namespace {
ret_type ret1 = ba::boyer_moore_search (hBeg, hEnd, nBeg, nEnd);
ret_type ret2 = ba::boyer_moore_horspool_search (hBeg, hEnd, nBeg, nEnd);
ret_type ret3 = ba::knuth_morris_pratt_search (hBeg, hEnd, nBeg, nEnd);
const int dist = ret1.first == hEnd ? -1 : std::distance ( hBeg, ret1.first );
const std::ptrdiff_t dist = ret1.first == hEnd ? -1 : std::distance ( hBeg, ret1.first );
std::cout << "(Pointers) Pattern is " << needle.length () << ", haysstack is " << haystack.length () << " chars long; " << std::endl;
try {
@ -147,7 +147,7 @@ namespace {
// Check using objects
template<typename Container>
void check_one_object ( const Container &haystack, const std::string &needle, int expected ) {
void check_one_object ( const Container &haystack, const std::string &needle, std::ptrdiff_t expected ) {
typedef typename Container::const_iterator iter_type;
typedef typename std::pair<iter_type, iter_type> ret_type;
typedef std::string::const_iterator pattern_type;
@ -169,7 +169,7 @@ namespace {
ret_type retr1r = bm_r (haystack);
ret_type ret2 = bmh (hBeg, hEnd);
ret_type ret3 = kmp (hBeg, hEnd);
const int dist = ret1.first == hEnd ? -1 : std::distance ( hBeg, ret1.first );
const std::ptrdiff_t dist = ret1.first == hEnd ? -1 : std::distance ( hBeg, ret1.first );
std::cout << "(Objects) Pattern is " << needle.length () << ", haysstack is " << haystack.length () << " chars long; " << std::endl;
try {
@ -224,7 +224,7 @@ namespace {
template<typename Container>
void check_one ( const Container &haystack, const std::string &needle, int expected ) {
void check_one ( const Container &haystack, const std::string &needle, std::ptrdiff_t expected ) {
check_one_iter ( haystack, needle, expected );
check_one_pointer ( haystack, needle, expected );
check_one_object ( haystack, needle, expected );

View File

@ -85,7 +85,7 @@ namespace {
std::cout << std::endl;
}
void check_one ( const vec &haystack, const vec &needle, int expected ) {
void check_one ( const vec &haystack, const vec &needle, std::ptrdiff_t expected ) {
std::size_t i;
std::clock_t sTime;
unsigned long stdDiff;
@ -147,7 +147,7 @@ BOOST_AUTO_TEST_CASE( test_main )
std::cout << "---- Middle -----" << std::endl;
check_one ( c1, p1f, -2 ); // Don't know answer
std::cout << "------ End ------" << std::endl;
check_one ( c1, p1e, c1.size() - p1e.size ());
check_one ( c1, p1e, static_cast<std::ptrdiff_t>(c1.size() - p1e.size ()));
std::cout << "--- Not found ---" << std::endl;
check_one ( c1, p1n, -1 ); // Not found
}

View File

@ -85,7 +85,7 @@ namespace {
std::cout << std::endl;
}
void check_one ( const vec &haystack, const vec &needle, int expected ) {
void check_one ( const vec &haystack, const vec &needle, std::ptrdiff_t expected ) {
std::size_t i;
std::clock_t sTime;
unsigned long stdDiff;
@ -147,7 +147,7 @@ BOOST_AUTO_TEST_CASE( test_main )
std::cout << "---- Middle -----" << std::endl;
check_one ( c1, p1f, -2 ); // Don't know answer
std::cout << "------ End ------" << std::endl;
check_one ( c1, p1e, c1.size() - p1e.size ());
check_one ( c1, p1e, static_cast<std::ptrdiff_t>(c1.size() - p1e.size ()));
std::cout << "--- Not found ---" << std::endl;
check_one ( c1, p1n, -1 ); // Not found
}

View File

@ -62,7 +62,7 @@ namespace {
return retVal;
}
void check_one ( const vec &haystack, const vec &needle, int expected ) {
void check_one ( const vec &haystack, const vec &needle, std::ptrdiff_t expected ) {
std::pair<vec::const_iterator, vec::const_iterator> res;
std::pair<vec::const_iterator, vec::const_iterator> exp; // the expected result
@ -117,7 +117,7 @@ BOOST_AUTO_TEST_CASE( test_main )
std::cout << "---- Middle -----" << std::endl;
check_one ( c1, p1f, -2 ); // Don't know answer
std::cout << "------ End ------" << std::endl;
check_one ( c1, p1e, c1.size() - p1e.size ());
check_one ( c1, p1e, static_cast<std::ptrdiff_t>(c1.size() - p1e.size ()));
std::cout << "--- Not found ---" << std::endl;
check_one ( c1, p1n, -1 ); // Not found
}