summaryrefslogtreecommitdiff
path: root/boost/algorithm/is_palindrome.hpp
diff options
context:
space:
mode:
authorDongHun Kwak <dh0128.kwak@samsung.com>2016-10-06 10:41:18 +0900
committerDongHun Kwak <dh0128.kwak@samsung.com>2016-10-06 10:43:11 +0900
commitf763a99a501650eff2c60288aa6f10ef916d769e (patch)
tree02af7e13f9a38c888ebf340fe764cbe7dae99da9 /boost/algorithm/is_palindrome.hpp
parent5cde13f21d36c7224b0e13d11c4b49379ae5210d (diff)
downloadboost-f763a99a501650eff2c60288aa6f10ef916d769e.tar.gz
boost-f763a99a501650eff2c60288aa6f10ef916d769e.tar.bz2
boost-f763a99a501650eff2c60288aa6f10ef916d769e.zip
Imported Upstream version 1.62.0upstream/1.62.0
Change-Id: I9d4c1ddb7b7d8f0069217ecc582700f9fda6dd4c Signed-off-by: DongHun Kwak <dh0128.kwak@samsung.com>
Diffstat (limited to 'boost/algorithm/is_palindrome.hpp')
-rw-r--r--boost/algorithm/is_palindrome.hpp161
1 files changed, 161 insertions, 0 deletions
diff --git a/boost/algorithm/is_palindrome.hpp b/boost/algorithm/is_palindrome.hpp
new file mode 100644
index 0000000000..cc63e18075
--- /dev/null
+++ b/boost/algorithm/is_palindrome.hpp
@@ -0,0 +1,161 @@
+/*
+ Copyright (c) Alexander Zaitsev <zamazan4ik@gmail.com>, 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)
+
+ See http://www.boost.org/ for latest version.
+*/
+
+/// \file is_palindrome.hpp
+/// \brief Checks the input sequence on palindrome.
+/// \author Alexander Zaitsev
+
+#ifndef BOOST_ALGORITHM_IS_PALINDROME_HPP
+#define BOOST_ALGORITHM_IS_PALINDROME_HPP
+
+#include <iterator>
+#include <functional>
+#include <cstring>
+
+#include <boost/range/begin.hpp>
+#include <boost/range/end.hpp>
+
+namespace boost { namespace algorithm {
+
+/// \fn is_palindrome ( BidirectionalIterator begin, BidirectionalIterator end, Predicate p )
+/// \return true if the entire sequence is palindrome
+///
+/// \param begin The start of the input sequence
+/// \param end One past the end of the input sequence
+/// \param p A predicate used to compare the values.
+///
+/// \note This function will return true for empty sequences and for palindromes.
+/// For other sequences function will return false.
+/// Complexity: O(N).
+template <typename BidirectionalIterator, typename Predicate>
+bool is_palindrome(BidirectionalIterator begin, BidirectionalIterator end, Predicate p )
+{
+ if(begin == end)
+ {
+ return true;
+ }
+
+ --end;
+ while(begin != end)
+ {
+ if(!p(*begin, *end))
+ {
+ return false;
+ }
+ ++begin;
+ if(begin == end)
+ {
+ break;
+ }
+ --end;
+ }
+ return true;
+}
+
+/// \fn is_palindrome ( BidirectionalIterator begin, BidirectionalIterator end )
+/// \return true if the entire sequence is palindrome
+///
+/// \param begin The start of the input sequence
+/// \param end One past the end of the input sequence
+///
+/// \note This function will return true for empty sequences and for palindromes.
+/// For other sequences function will return false.
+/// Complexity: O(N).
+template <typename BidirectionalIterator>
+bool is_palindrome(BidirectionalIterator begin, BidirectionalIterator end)
+{
+ if(begin == end)
+ {
+ return true;
+ }
+
+ --end;
+ while(begin != end)
+ {
+ if(!(*begin == *end))
+ {
+ return false;
+ }
+ ++begin;
+ if(begin == end)
+ {
+ break;
+ }
+ --end;
+ }
+ return true;
+}
+
+/// \fn is_palindrome ( const R& range )
+/// \return true if the entire sequence is palindrome
+///
+/// \param range The range to be tested.
+///
+/// \note This function will return true for empty sequences and for palindromes.
+/// For other sequences function will return false.
+/// Complexity: O(N).
+template <typename R>
+bool is_palindrome(const R& range)
+{
+ return is_palindrome(boost::begin(range), boost::end(range));
+}
+
+/// \fn is_palindrome ( const R& range, Predicate p )
+/// \return true if the entire sequence is palindrome
+///
+/// \param range The range to be tested.
+/// \param p A predicate used to compare the values.
+///
+/// \note This function will return true for empty sequences and for palindromes.
+/// For other sequences function will return false.
+/// Complexity: O(N).
+template <typename R, typename Predicate>
+bool is_palindrome(const R& range, Predicate p)
+{
+ return is_palindrome(boost::begin(range), boost::end(range), p);
+}
+
+
+/// \fn is_palindrome ( const char* str )
+/// \return true if the entire sequence is palindrome
+///
+/// \param str C-string to be tested.
+///
+/// \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)
+{
+ if(!str)
+ return true;
+ return is_palindrome(str, str + strlen(str));
+}
+
+
+/// \fn is_palindrome ( const char* str, Predicate p )
+/// \return true if the entire sequence is palindrome
+///
+/// \param str C-string to be tested.
+/// \param p A predicate used to compare the values.
+///
+/// \note This function will return true for empty sequences and for palindromes.
+/// For other sequences function will return false.
+/// Complexity: O(N).
+template<typename Predicate>
+bool is_palindrome(const char* str, Predicate p)
+{
+ if(!str)
+ return true;
+ return is_palindrome(str, str + strlen(str), p);
+}
+
+}}
+
+#endif // BOOST_ALGORITHM_IS_PALINDROME_HPP