8#ifndef INCLUDED_BSLSTL_BOYERMOOREHORSPOOLSEARCHER
9#define INCLUDED_BSLSTL_BOYERMOOREHORSPOOLSEARCHER
655#include <bslscm_version.h>
696template <
class RNDACC_ITR_NEEDLE,
706 typedef typename bsl::iterator_traits<RNDACC_ITR_NEEDLE>::value_type
711 typedef typename bsl::iterator_traits<RNDACC_ITR_NEEDLE>::difference_type
719 typedef BloombergLP::bslmf::MovableRefUtil MoveUtil;
721 typedef unsigned char ShortNeedleSkipType;
728 ShortNeedleSkipArray;
738 void privateInstallNewTable(
746 void privateInstallTableOverOld(
752 void privateInstallMismatchedTable(
757 void privateDeleteTable();
772 bool privateUseShortNeedleOptimization()
const;
777 bool privateHasSameNeedleOptimization(
782 std::size_t d_needleLength;
783 BloombergLP::bslma::Allocator *d_allocator_p;
801 RNDACC_ITR_NEEDLE needleFirst,
802 RNDACC_ITR_NEEDLE needleLast,
805 BloombergLP::bslma::Allocator *basicAllocator);
819 BloombergLP::bslmf::MovableRef<BoyerMooreHorspoolSearcher_CharImp>
829 BloombergLP::bslma::Allocator *basicAllocator);
840 BloombergLP::bslmf::MovableRef<BoyerMooreHorspoolSearcher_CharImp>
842 BloombergLP::bslma::Allocator *basicAllocator);
858 BloombergLP::bslmf::MovableRef<BoyerMooreHorspoolSearcher_CharImp>
875 BloombergLP::bslma::Allocator *
allocator()
const;
886template <
class RNDACC_ITR_NEEDLE,
893 typedef typename bsl::iterator_traits<RNDACC_ITR_NEEDLE>::value_type
896 typedef typename bsl::iterator_traits<RNDACC_ITR_NEEDLE>::difference_type
907 typedef BloombergLP::bslmf::MovableRefUtil MoveUtil;
927 RNDACC_ITR_NEEDLE needleFirst,
928 RNDACC_ITR_NEEDLE needleLast,
931 BloombergLP::bslma::Allocator *basicAllocator);
945 BloombergLP::bslmf::MovableRef<BoyerMooreHorspoolSearcher_GeneralImp>
955 BloombergLP::bslma::Allocator *basicAllocator);
965 BloombergLP::bslmf::MovableRef<BoyerMooreHorspoolSearcher_GeneralImp>
967 BloombergLP::bslma::Allocator *basicAllocator);
980 BloombergLP::bslmf::MovableRef<BoyerMooreHorspoolSearcher_GeneralImp>
997 BloombergLP::bslma::Allocator *
allocator()
const;
1009template <
class RNDACC_ITR_NEEDLE,
1011 typename bsl::iterator_traits<RNDACC_ITR_NEEDLE>::value_type>,
1013 typename bsl::iterator_traits<RNDACC_ITR_NEEDLE>::value_type>
1022 typedef typename bsl::iterator_traits<RNDACC_ITR_NEEDLE>::value_type
1027 typename bsl::iterator_traits<RNDACC_ITR_NEEDLE>::value_type>
1032 typename bsl::iterator_traits<RNDACC_ITR_NEEDLE>::value_type>
1040 typedef typename bsl::iterator_traits<RNDACC_ITR_NEEDLE>::difference_type
1045 typedef BloombergLP::bslmf::MovableRefUtil MoveUtil;
1047 enum { k_CAN_OPTIMIZE_FOR_CHAR = (
1056 k_CAN_OPTIMIZE_FOR_CHAR,
1058 BloombergLP::bslstl::
1059 BoyerMooreHorspoolSearcher_CharImp<RNDACC_ITR_NEEDLE,
1062 BloombergLP::bslstl::
1063 BoyerMooreHorspoolSearcher_GeneralImp<RNDACC_ITR_NEEDLE,
1068 RNDACC_ITR_NEEDLE d_needleFirst;
1069 RNDACC_ITR_NEEDLE d_needleLast;
1070 difference_type d_needleLength;
1103 EQUAL
equal = EQUAL(),
1104 BloombergLP::bslma::Allocator *basicAllocator = 0);
1119 BloombergLP::bslmf::MovableRef<BoyerMooreHorspoolSearcher> original)
1129 BloombergLP::bslma::Allocator *basicAllocator);
1141 BloombergLP::bslmf::MovableRef<BoyerMooreHorspoolSearcher>
1143 BloombergLP::bslma::Allocator *basicAllocator);
1161 BloombergLP::bslmf::MovableRef<BoyerMooreHorspoolSearcher> rhs);
1183 template<
class RNDACC_ITR_HAYSTACK>
1185 RNDACC_ITR_HAYSTACK haystackFirst,
1186 RNDACC_ITR_HAYSTACK haystackLast)
const;
1203 EQUAL
equal()
const;
1206 BloombergLP::bslma::Allocator *
allocator()
const;
1212#ifndef BSLS_LIBRARYFEATURES_HAS_CPP17_SEARCH_FUNCTORS
1224template <
class RandomAccessIterator1,
1226 typename iterator_traits<RandomAccessIterator1>::value_type>,
1227 class BinaryPredicate = equal_to<
1228 typename iterator_traits<RandomAccessIterator1>::value_type> >
1229class boyer_moore_horspool_searcher {
1233 BloombergLP::bslstl::BoyerMooreHorspoolSearcher<RandomAccessIterator1,
1235 BinaryPredicate> d_imp;
1252 boyer_moore_horspool_searcher(RandomAccessIterator1 pat_first,
1253 RandomAccessIterator1 pat_last,
1255 BinaryPredicate pred =
1258 boyer_moore_horspool_searcher(
1259 const boyer_moore_horspool_searcher& original)
1264 boyer_moore_horspool_searcher(
1265 BloombergLP::bslmf::MovableRef<boyer_moore_horspool_searcher>
1266 original) =
default;
1272 ~boyer_moore_horspool_searcher() =
default;
1276 boyer_moore_horspool_searcher& operator=(
1277 const boyer_moore_horspool_searcher&
rhs) =
default;
1281 boyer_moore_horspool_searcher& operator=(
1282 BloombergLP::bslmf::MovableRef<boyer_moore_horspool_searcher>
1304 template <
class RandomAccessIterator2>
1305 pair<RandomAccessIterator2,
1306 RandomAccessIterator2> operator()(RandomAccessIterator2 first,
1307 RandomAccessIterator2 last)
const;
1325template <
class RNDACC_ITR_NEEDLE,
1330BoyerMooreHorspoolSearcher_CharImp<RNDACC_ITR_NEEDLE,
1332 EQUAL>::privateInstallNewTable(
1333 const BoyerMooreHorspoolSearcher_CharImp&
1339 privateUseShortNeedleOptimization())) {
1340 ShortNeedleSkipArray *arrayPtr =
new (*d_allocator_p)
1341 ShortNeedleSkipArray;
1344 static_cast<ShortNeedleSkipArray *
>(
object.d_table_p)->data(),
1347 d_table_p = arrayPtr;
1349 LongNeedleSkipArray *arrayPtr =
new (*d_allocator_p)
1350 LongNeedleSkipArray;
1353 static_cast<LongNeedleSkipArray *
>(
object.d_table_p)->
cbegin(),
1354 static_cast<LongNeedleSkipArray *
>(
object.d_table_p)->
cend(),
1357 d_table_p = arrayPtr;
1361template <
class RNDACC_ITR_NEEDLE,
1366BoyerMooreHorspoolSearcher_CharImp<RNDACC_ITR_NEEDLE,
1368 EQUAL>::privateInstallTableOverOld(
1369 const BoyerMooreHorspoolSearcher_CharImp&
1373 BSLS_ASSERT(privateHasSameNeedleOptimization(
object));
1376 privateUseShortNeedleOptimization())) {
1377 ShortNeedleSkipArray *arrayPtr =
static_cast<ShortNeedleSkipArray *
>(
1381 static_cast<ShortNeedleSkipArray *
>(
object.d_table_p)->data(),
1385 LongNeedleSkipArray *arrayPtr =
static_cast< LongNeedleSkipArray *
>(
1388 static_cast<LongNeedleSkipArray *
>(
object.d_table_p)->
cbegin(),
1389 static_cast<LongNeedleSkipArray *
>(
object.d_table_p)->
cend(),
1394template <
class RNDACC_ITR_NEEDLE,
1399BoyerMooreHorspoolSearcher_CharImp<RNDACC_ITR_NEEDLE,
1401 EQUAL>::privateInstallMismatchedTable(
1402 const BoyerMooreHorspoolSearcher_CharImp&
1406 object.privateUseShortNeedleOptimization())) {
1407 ShortNeedleSkipArray *arrayPtr =
new (*d_allocator_p)
1408 ShortNeedleSkipArray;
1411 static_cast<ShortNeedleSkipArray *
>(
object.d_table_p)->data(),
1414 privateDeleteTable();
1416 d_table_p = arrayPtr;
1418 LongNeedleSkipArray *arrayPtr =
new (*d_allocator_p)
1419 LongNeedleSkipArray;
1421 static_cast<LongNeedleSkipArray *
>(
object.d_table_p)->
cbegin(),
1422 static_cast<LongNeedleSkipArray *
>(
object.d_table_p)->
cend(),
1424 privateDeleteTable();
1426 d_table_p = arrayPtr;
1430template <
class RNDACC_ITR_NEEDLE,
1435BoyerMooreHorspoolSearcher_CharImp<RNDACC_ITR_NEEDLE,
1437 EQUAL>::privateDeleteTable()
1440 privateUseShortNeedleOptimization())) {
1441 d_allocator_p->deleteObjectRaw(
static_cast<ShortNeedleSkipArray *
>(
1444 d_allocator_p->deleteObjectRaw(
static_cast< LongNeedleSkipArray *
>(
1451template <
class RNDACC_ITR_NEEDLE,
1456BoyerMooreHorspoolSearcher_CharImp<RNDACC_ITR_NEEDLE,
1458 EQUAL>::privateSetPostMoveState(
1459 BoyerMooreHorspoolSearcher_CharImp *
object)
1465 object->d_needleLength = 0;
1466 object->d_table_p = 0;
1469template <
class RNDACC_ITR_NEEDLE,
1474BoyerMooreHorspoolSearcher_CharImp<RNDACC_ITR_NEEDLE,
1476 EQUAL>::privateUseShortNeedleOptimization()
1479 return d_needleLength <= UCHAR_MAX;
1482template <
class RNDACC_ITR_NEEDLE,
1487BoyerMooreHorspoolSearcher_CharImp<RNDACC_ITR_NEEDLE,
1489 EQUAL>::privateHasSameNeedleOptimization(
1490 const BoyerMooreHorspoolSearcher_CharImp&
1494 return this->privateUseShortNeedleOptimization()
1495 ==
object.privateUseShortNeedleOptimization();
1499template <
class RNDACC_ITR_NEEDLE,
1503BoyerMooreHorspoolSearcher_CharImp<RNDACC_ITR_NEEDLE,
1506BoyerMooreHorspoolSearcher_CharImp(
1507 RNDACC_ITR_NEEDLE needleFirst,
1508 RNDACC_ITR_NEEDLE needleLast,
1511 BloombergLP::bslma::Allocator *basicAllocator)
1512: d_needleLength(needleLast - needleFirst)
1513, d_allocator_p(
bslma::Default::allocator(basicAllocator))
1518 if (0 == d_needleLength) {
1523 privateUseShortNeedleOptimization())) {
1524 ShortNeedleSkipArray *arrayPtr =
new (*d_allocator_p)
1525 ShortNeedleSkipArray;
1526 std::memset(arrayPtr->data(),
1527 static_cast<ShortNeedleSkipType
>(d_needleLength),
1529 d_table_p = arrayPtr;
1531 LongNeedleSkipArray *arrayPtr =
new (*d_allocator_p)
1532 LongNeedleSkipArray;
1534 std::fill(arrayPtr->begin(), arrayPtr->end(), d_needleLength);
1536 d_table_p = arrayPtr;
1539 for (RNDACC_ITR_NEEDLE current = needleFirst,
1540 last = needleLast - 1;
1541 last != current; ++current) {
1543 const unsigned char index =
static_cast<unsigned char>(*current);
1544 std::size_t skipValue = d_needleLength
1546 - (current - needleFirst);
1549 privateUseShortNeedleOptimization())) {
1552 (*
static_cast<ShortNeedleSkipArray *
>(d_table_p))[index]
1553 =
static_cast<ShortNeedleSkipType
>(skipValue);
1555 (*
static_cast< LongNeedleSkipArray *
>(d_table_p))[index]
1556 =
static_cast< LongNeedleSkipType
>(skipValue);
1561template <
class RNDACC_ITR_NEEDLE,
1568BoyerMooreHorspoolSearcher_CharImp(
1570: d_needleLength(original.d_needleLength)
1571, d_allocator_p( original.d_allocator_p)
1574 if (0 < d_needleLength) {
1575 privateInstallNewTable(original);
1579template <
class RNDACC_ITR_NEEDLE,
1586BoyerMooreHorspoolSearcher_CharImp(
1587 BloombergLP::bslmf::MovableRef<BoyerMooreHorspoolSearcher_CharImp>
1590: d_needleLength(MoveUtil::access(original).d_needleLength)
1591, d_allocator_p( MoveUtil::access(original).d_allocator_p)
1592, d_table_p( MoveUtil::access(original).d_table_p)
1594 privateSetPostMoveState(&MoveUtil::access(original));
1597template <
class RNDACC_ITR_NEEDLE,
1604BoyerMooreHorspoolSearcher_CharImp(
1606 BloombergLP::bslma::Allocator *basicAllocator)
1607: d_needleLength(original.d_needleLength)
1608, d_allocator_p(
bslma::Default::allocator(basicAllocator))
1611 if (0 < d_needleLength) {
1612 privateInstallNewTable(original);
1616template <
class RNDACC_ITR_NEEDLE,
1623BoyerMooreHorspoolSearcher_CharImp(
1624 BloombergLP::bslmf::MovableRef<BoyerMooreHorspoolSearcher_CharImp>
1626 BloombergLP::bslma::Allocator *basicAllocator)
1627: d_needleLength(MoveUtil::access(original).d_needleLength)
1628, d_allocator_p(
bslma::Default::allocator(basicAllocator))
1631 if (d_allocator_p == MoveUtil::access(original).d_allocator_p) {
1633 d_table_p = MoveUtil::access(original).d_table_p;
1635 privateSetPostMoveState(&MoveUtil::access(original));
1637 if (0 < d_needleLength) {
1638 privateInstallNewTable(MoveUtil::access(original));
1643template <
class RNDACC_ITR_NEEDLE,
1650~BoyerMooreHorspoolSearcher_CharImp()
1652 privateDeleteTable();
1656template <
class RNDACC_ITR_NEEDLE,
1669 if (0 < rhs.d_needleLength) {
1670 if (d_table_p && privateHasSameNeedleOptimization(rhs)) {
1671 privateInstallTableOverOld(rhs);
1673 privateInstallMismatchedTable(rhs);
1676 privateDeleteTable();
1679 d_needleLength = rhs.d_needleLength;
1684template <
class RNDACC_ITR_NEEDLE,
1694 BloombergLP::bslmf::MovableRef<BoyerMooreHorspoolSearcher_CharImp>
1697 if (d_allocator_p == MoveUtil::access(rhs).d_allocator_p) {
1698 d_allocator_p->deallocate(d_table_p);
1699 d_table_p = MoveUtil::access(rhs).d_table_p;
1700 MoveUtil::access(rhs).d_table_p = 0;
1702 if (0 < MoveUtil::access(rhs).d_needleLength) {
1703 if (d_table_p && privateHasSameNeedleOptimization(
1704 MoveUtil::access(rhs))) {
1705 privateInstallTableOverOld(rhs);
1707 privateInstallMismatchedTable(MoveUtil::access(rhs));
1710 privateDeleteTable();
1714 d_needleLength = MoveUtil::access(rhs).d_needleLength;
1720template <
class RNDACC_ITR_NEEDLE,
1727 EQUAL>::difference_type
1730 EQUAL>::badCharacterSkip(
1734 unsigned char index =
static_cast<unsigned char>(value);
1737 privateUseShortNeedleOptimization())) {
1738 return (*
static_cast<ShortNeedleSkipArray *
>(d_table_p))[index];
1741 return (*
static_cast< LongNeedleSkipArray *
>(d_table_p))[index];
1746template <
class RNDACC_ITR_NEEDLE,
1752 EQUAL>::hash()
const
1757template <
class RNDACC_ITR_NEEDLE,
1763 EQUAL>::equal()
const
1768template <
class RNDACC_ITR_NEEDLE,
1775 EQUAL>::allocator()
const
1777 return d_allocator_p;
1785template <
class RNDACC_ITR_NEEDLE,
1792BoyerMooreHorspoolSearcher_GeneralImp(
1793 RNDACC_ITR_NEEDLE needleFirst,
1794 RNDACC_ITR_NEEDLE needleLast,
1797 BloombergLP::bslma::Allocator *basicAllocator)
1798: d_needleLength(needleLast - needleFirst)
1799, d_map(0, hash, equal, basicAllocator)
1803 if (0 < d_needleLength) {
1804 for (RNDACC_ITR_NEEDLE current = needleFirst,
1805 last = needleLast - 1;
1806 last != current; ++current) {
1807 d_map.
insert(std::make_pair(*current,
1810 - (current - needleFirst)));
1815template <
class RNDACC_ITR_NEEDLE,
1822BoyerMooreHorspoolSearcher_GeneralImp(
1824: d_needleLength(original.d_needleLength)
1825, d_map(original, original.allocator())
1829template <
class RNDACC_ITR_NEEDLE,
1836BoyerMooreHorspoolSearcher_GeneralImp(
1837 BloombergLP::bslmf::MovableRef<BoyerMooreHorspoolSearcher_GeneralImp>
1840: d_needleLength(MoveUtil::move(MoveUtil::access(original).d_needleLength))
1841, d_map( MoveUtil::move(MoveUtil::access(original).d_map))
1845template <
class RNDACC_ITR_NEEDLE,
1852BoyerMooreHorspoolSearcher_GeneralImp(
1854 BloombergLP::bslma::Allocator *basicAllocator)
1855: d_needleLength(original.d_needleLength)
1856, d_map(original.d_map, basicAllocator)
1860template <
class RNDACC_ITR_NEEDLE,
1867BoyerMooreHorspoolSearcher_GeneralImp(
1868 BloombergLP::bslmf::MovableRef<BoyerMooreHorspoolSearcher_GeneralImp>
1870 BloombergLP::bslma::Allocator *basicAllocator)
1871: d_needleLength(MoveUtil::move(MoveUtil::access(original).d_needleLength))
1872, d_map( MoveUtil::move(MoveUtil::access(original).d_map),
1878template <
class RNDACC_ITR_NEEDLE,
1890 d_needleLength = rhs.d_needleLength;
1896template <
class RNDACC_ITR_NEEDLE,
1906 BloombergLP::bslmf::MovableRef<BoyerMooreHorspoolSearcher_GeneralImp>
1909 d_needleLength = MoveUtil::move(MoveUtil::access(rhs).d_needleLength);
1910 d_map = MoveUtil::move(MoveUtil::access(rhs).d_map);
1916template <
class RNDACC_ITR_NEEDLE,
1923 EQUAL>::difference_type
1926 EQUAL>::badCharacterSkip(
1931 return d_map.cend() == result ? d_needleLength : result->second;
1934template <
class RNDACC_ITR_NEEDLE,
1940 EQUAL>::hash()
const
1942 return d_map.hash_function();
1945template <
class RNDACC_ITR_NEEDLE,
1951 EQUAL>::equal()
const
1953 return d_map.key_eq();
1956template <
class RNDACC_ITR_NEEDLE,
1963 EQUAL>::allocator()
const
1965 return d_map.get_allocator().mechanism();
1973template <
class RNDACC_ITR_NEEDLE,
1980 EQUAL>::privateSetPostMoveState(
1986 object->d_needleFirst = d_needleFirst;
1987 object->d_needleLast = d_needleFirst;
1988 object->d_needleLength = 0;
1992template <
class RNDACC_ITR_NEEDLE,
1995BoyerMooreHorspoolSearcher<RNDACC_ITR_NEEDLE,
1998BoyerMooreHorspoolSearcher(RNDACC_ITR_NEEDLE needleFirst,
1999 RNDACC_ITR_NEEDLE needleLast,
2002 BloombergLP::bslma::Allocator *basicAllocator)
2003: d_needleFirst( needleFirst)
2004, d_needleLast( needleLast)
2005, d_needleLength(
bsl::distance(needleFirst, needleLast))
2006, d_imp(needleFirst, needleLast, hash, equal, basicAllocator)
2011template <
class RNDACC_ITR_NEEDLE,
2018: d_needleFirst( original.d_needleFirst)
2019, d_needleLast( original.d_needleLast)
2020, d_needleLength(original.d_needleLength)
2021, d_imp( original.d_imp,
2022 BloombergLP::
bslma::Default::defaultAllocator())
2026template <
class RNDACC_ITR_NEEDLE,
2032BoyerMooreHorspoolSearcher(
2033 BloombergLP::bslmf::MovableRef<BoyerMooreHorspoolSearcher> original)
2035: d_needleFirst( MoveUtil::move(MoveUtil::access(original).d_needleFirst))
2036, d_needleLast( MoveUtil::move(MoveUtil::access(original).d_needleLast))
2037, d_needleLength(MoveUtil::move(MoveUtil::access(original).d_needleLength))
2038, d_imp( MoveUtil::move(MoveUtil::access(original).d_imp))
2040 privateSetPostMoveState(&MoveUtil::access(original));
2043template <
class RNDACC_ITR_NEEDLE,
2050 BloombergLP::bslma::Allocator *basicAllocator)
2051: d_needleFirst( original.d_needleFirst)
2052, d_needleLast( original.d_needleLast)
2053, d_needleLength(original.d_needleLength)
2054, d_imp( original.d_imp, basicAllocator)
2058template <
class RNDACC_ITR_NEEDLE,
2064BoyerMooreHorspoolSearcher(
2065 BloombergLP::bslmf::MovableRef<BoyerMooreHorspoolSearcher> original,
2066 BloombergLP::bslma::Allocator *basicAllocator)
2067: d_needleFirst( MoveUtil::move(MoveUtil::access(original).d_needleFirst))
2068, d_needleLast( MoveUtil::move(MoveUtil::access(original).d_needleLast))
2069, d_needleLength(MoveUtil::move(MoveUtil::access(original).d_needleLength))
2070, d_imp( MoveUtil::move(MoveUtil::access(original).d_imp),
2073 privateSetPostMoveState(&MoveUtil::access(original));
2077template <
class RNDACC_ITR_NEEDLE,
2089 d_needleFirst = rhs.d_needleFirst;
2090 d_needleLast = rhs.d_needleLast;
2091 d_needleLength = rhs.d_needleLength;
2097template <
class RNDACC_ITR_NEEDLE,
2107 BloombergLP::bslmf::MovableRef<BoyerMooreHorspoolSearcher> rhs)
2111 d_needleFirst = MoveUtil::move(MoveUtil::access(rhs).d_needleFirst);
2112 d_needleLast = MoveUtil::move(MoveUtil::access(rhs).d_needleLast);
2113 d_needleLength = MoveUtil::move(MoveUtil::access(rhs).d_needleLength);
2114 d_imp = MoveUtil::move(MoveUtil::access(rhs).d_imp);
2116 privateSetPostMoveState(&MoveUtil::access(rhs));
2123template <
class RNDACC_ITR_NEEDLE,
2126template <
class RNDACC_ITR_HAYSTACK>
2131 RNDACC_ITR_HAYSTACK haystackFirst,
2132 RNDACC_ITR_HAYSTACK haystackLast)
const
2136 if (0 == d_needleLength) {
2137 return std::make_pair(haystackFirst, haystackFirst);
2140 std::size_t haystackLength = haystackLast - haystackFirst;
2142 for (std::size_t possibleMatch = 0;
2143 d_needleLength + possibleMatch <= haystackLength;
2144 possibleMatch += d_imp.badCharacterSkip(haystackFirst[possibleMatch
2150 const EQUAL comparator(equal());
2152 for (std::size_t idx = d_needleLength - 1;
2153 comparator(haystackFirst[possibleMatch + idx],
2154 d_needleFirst[idx]);
2158 return std::make_pair(haystackFirst + possibleMatch,
2159 haystackFirst + possibleMatch
2166 return std::make_pair(haystackLast, haystackLast);
2169template <
class RNDACC_ITR_NEEDLE,
2175 EQUAL>::needleFirst()
const
2177 return d_needleFirst;
2180template <
class RNDACC_ITR_NEEDLE,
2186 EQUAL>::needleLast()
const
2188 return d_needleLast;
2191template <
class RNDACC_ITR_NEEDLE,
2197 EQUAL>::hash()
const
2199 return d_imp.
hash();
2202template <
class RNDACC_ITR_NEEDLE,
2208 EQUAL>::equal()
const
2210 return d_imp.
equal();
2213template <
class RNDACC_ITR_NEEDLE,
2220 EQUAL>::allocator()
const
2228#ifndef BSLS_LIBRARYFEATURES_HAS_CPP17_SEARCH_FUNCTORS
2236template <
class RandomAccessIterator1,
2238 class BinaryPredicate>
2240boyer_moore_horspool_searcher<RandomAccessIterator1,
2242 BinaryPredicate>::boyer_moore_horspool_searcher(
2243 RandomAccessIterator1 pat_first,
2244 RandomAccessIterator1 pat_last,
2246 BinaryPredicate pred)
2247: d_imp(pat_first, pat_last, hf, pred)
2253template <
class RandomAccessIterator1,
2255 class BinaryPredicate>
2256template <
class RandomAccessIterator2>
2258pair<RandomAccessIterator2,
2259 RandomAccessIterator2> boyer_moore_horspool_searcher<
2260 RandomAccessIterator1,
2262 BinaryPredicate>::operator()(
2263 RandomAccessIterator2 first,
2264 RandomAccessIterator2 last)
2269 return d_imp(first, last);
2282template <
class RNDACC_ITR_NEEDLE,
2292template <
class RNDACC_ITR_NEEDLE,
2303template <
class RNDACC_ITR_NEEDLE,
Definition bslstl_pair.h:1280
Definition bslstl_unorderedmap.h:1123
pair< iterator, bool > insert(const value_type &value)
Definition bslstl_unorderedmap.h:3543
BloombergLP::bslstl::HashTableIterator< const value_type, difference_type > const_iterator
Definition bslstl_unorderedmap.h:1235
Definition bslstl_boyermoorehorspoolsearcher.h:699
EQUAL equal() const
Return the equality comparison functor supplied on construction.
Definition bslstl_boyermoorehorspoolsearcher.h:1763
~BoyerMooreHorspoolSearcher_CharImp()
Destroy this object;.
Definition bslstl_boyermoorehorspoolsearcher.h:1650
BloombergLP::bslma::Allocator * allocator() const
Return the allocator supplied on construction.
Definition bslstl_boyermoorehorspoolsearcher.h:1775
difference_type badCharacterSkip(const value_type &value) const
Definition bslstl_boyermoorehorspoolsearcher.h:1730
BoyerMooreHorspoolSearcher_CharImp & operator=(const BoyerMooreHorspoolSearcher_CharImp &rhs)
Definition bslstl_boyermoorehorspoolsearcher.h:1665
bsl::iterator_traits< RNDACC_ITR_NEEDLE >::difference_type difference_type
Definition bslstl_boyermoorehorspoolsearcher.h:712
bsl::iterator_traits< RNDACC_ITR_NEEDLE >::value_type value_type
Definition bslstl_boyermoorehorspoolsearcher.h:707
HASH hash() const
Return the hashing functor supplied on construction.
Definition bslstl_boyermoorehorspoolsearcher.h:1752
Definition bslstl_boyermoorehorspoolsearcher.h:889
difference_type badCharacterSkip(const value_type &value) const
Definition bslstl_boyermoorehorspoolsearcher.h:1926
EQUAL equal() const
Return the equality comparison functor supplied on construction.
Definition bslstl_boyermoorehorspoolsearcher.h:1951
bsl::iterator_traits< RNDACC_ITR_NEEDLE >::value_type value_type
Definition bslstl_boyermoorehorspoolsearcher.h:894
BoyerMooreHorspoolSearcher_GeneralImp & operator=(const BoyerMooreHorspoolSearcher_GeneralImp &rhs)
Definition bslstl_boyermoorehorspoolsearcher.h:1887
bsl::iterator_traits< RNDACC_ITR_NEEDLE >::difference_type difference_type
Definition bslstl_boyermoorehorspoolsearcher.h:897
BloombergLP::bslma::Allocator * allocator() const
Return the allocator used by this object to supply memory.
Definition bslstl_boyermoorehorspoolsearcher.h:1963
HASH hash() const
Return the hashing functor supplied on construction.
Definition bslstl_boyermoorehorspoolsearcher.h:1940
Definition bslstl_boyermoorehorspoolsearcher.h:1015
bsl::pair< RNDACC_ITR_HAYSTACK, RNDACC_ITR_HAYSTACK > operator()(RNDACC_ITR_HAYSTACK haystackFirst, RNDACC_ITR_HAYSTACK haystackLast) const
Definition bslstl_boyermoorehorspoolsearcher.h:2130
~BoyerMooreHorspoolSearcher()=default
BloombergLP::bslma::Allocator * allocator() const
Return the allocator used by this object to supply memory.
Definition bslstl_boyermoorehorspoolsearcher.h:2220
EQUAL equal() const
Return the equality comparison functor supplied on construction.
Definition bslstl_boyermoorehorspoolsearcher.h:2208
bsl::iterator_traits< RNDACC_ITR_NEEDLE >::value_type value_type
Definition bslstl_boyermoorehorspoolsearcher.h:1023
BoyerMooreHorspoolSearcher & operator=(const BoyerMooreHorspoolSearcher &rhs)
Definition bslstl_boyermoorehorspoolsearcher.h:2086
HASH hash() const
Return the hashing functor supplied on construction.
Definition bslstl_boyermoorehorspoolsearcher.h:2197
bsl::equal_to< typename bsl::iterator_traits< RNDACC_ITR_NEEDLE >::value_type > DefaultEqual
the default type for the EQUAL optional template parameter
Definition bslstl_boyermoorehorspoolsearcher.h:1033
RNDACC_ITR_NEEDLE needleLast() const
Definition bslstl_boyermoorehorspoolsearcher.h:2186
bsl::hash< typename bsl::iterator_traits< RNDACC_ITR_NEEDLE >::value_type > DefaultHash
the default type for the HASH optional template parameter
Definition bslstl_boyermoorehorspoolsearcher.h:1028
RNDACC_ITR_NEEDLE needleFirst() const
Definition bslstl_boyermoorehorspoolsearcher.h:2175
#define BSLS_ASSERT(X)
Definition bsls_assert.h:1976
#define BSLS_IDENT(str)
BSLS_IDENT() - insert string into .comment binary segment (if supported)
Definition bsls_ident.h:238
#define BSLS_KEYWORD_NOEXCEPT
Definition bsls_keyword.h:674
Definition bdlat_valuetypefunctions.h:939
T::const_iterator cend(const T &container)
Definition bslstl_iterator.h:1709
ALLOCATOR const STRING_VIEW_LIKE_TYPE & rhs
Definition bslstl_string.h:3918
T::const_iterator cbegin(const T &container)
Definition bslstl_iterator.h:1651
Definition baljsn_encoder_testtypes.h:76
Definition bslstl_algorithm.h:84
Definition bslstl_array.h:293
Definition bslmf_conditional.h:123
Definition bslstl_equalto.h:316
Definition bslstl_hash.h:495
Definition bslmf_issame.h:146
Definition bslma_usesbslmaallocator.h:344
Definition bslmf_isbitwisecopyable.h:298
Definition bslmf_isbitwiseequalitycomparable.h:500