8#ifndef INCLUDED_BSLSTL_DEFAULTSEARCHER
9#define INCLUDED_BSLSTL_DEFAULTSEARCHER
355#include <bslscm_version.h>
386template <
class FORWARD_ITR_NEEDLE,
388 typename bsl::iterator_traits<FORWARD_ITR_NEEDLE>::value_type> >
395 typedef typename bsl::iterator_traits<FORWARD_ITR_NEEDLE>::value_type
398 typedef typename bsl::iterator_traits<FORWARD_ITR_NEEDLE>::
402 FORWARD_ITR_NEEDLE d_needleFirst;
403 FORWARD_ITR_NEEDLE d_needleLast;
417 EQUAL
equal = EQUAL());
466 template<
class FORWARD_ITR_HAYSTACK>
468 FORWARD_ITR_HAYSTACK haystackFirst,
469 FORWARD_ITR_HAYSTACK haystackLast)
const;
498template <
class FORWARD_ITR_NEEDLE,
500 class FORWARD_ITR_HAYSTACK>
512 bsl::iterator_traits<FORWARD_ITR_NEEDLE>::value_type
517 bsl::iterator_traits<FORWARD_ITR_NEEDLE>::value_type
521 bsl::iterator_traits<FORWARD_ITR_HAYSTACK>::value_type
540 template <
class FORWARD_ITR_NEEDLE,
542 class FORWARD_ITR_HAYSTACK>
547 FORWARD_ITR_HAYSTACK>::value
549 FORWARD_ITR_HAYSTACK>
550 >::type
doSearch(
const FORWARD_ITR_HAYSTACK& haystackFirst,
551 const FORWARD_ITR_HAYSTACK& haystackLast,
552 const FORWARD_ITR_NEEDLE& needleFirst,
553 const FORWARD_ITR_NEEDLE& needleLast,
583 template <
class FORWARD_ITR_NEEDLE,
585 class FORWARD_ITR_HAYSTACK>
590 FORWARD_ITR_HAYSTACK>::value
592 FORWARD_ITR_HAYSTACK>
593 >::type
doSearch(
const FORWARD_ITR_HAYSTACK& haystackFirst,
594 const FORWARD_ITR_HAYSTACK& haystackLast,
595 const FORWARD_ITR_NEEDLE& needleFirst,
596 const FORWARD_ITR_NEEDLE& needleLast,
603#ifndef BSLS_LIBRARYFEATURES_HAS_CPP17_SEARCH_FUNCTORS
612template<
class ForwardIterator1,
613 class BinaryPredicate = equal_to<
614 typename bsl::iterator_traits<ForwardIterator1>::value_type> >
618 BloombergLP::bslstl::DefaultSearcher<ForwardIterator1,
619 BinaryPredicate> d_imp;
632 ForwardIterator1 pat_last,
633 BinaryPredicate pred = BinaryPredicate());
658 BloombergLP::bslmf::MovableRef<default_searcher>
681 template<
class ForwardIterator2>
684 ForwardIterator2 first,
685 ForwardIterator2 last)
const;
703template <
class FORWARD_ITR_NEEDLE,
706DefaultSearcher<FORWARD_ITR_NEEDLE,
709 FORWARD_ITR_NEEDLE needleLast,
711: d_needleFirst(needleFirst)
712, d_needleLast( needleLast)
715 BSLS_ASSERT(0 <= bsl::distance(needleFirst, needleLast));
719template <
class FORWARD_ITR_NEEDLE,
721template <
class FORWARD_ITR_HAYSTACK>
725 FORWARD_ITR_HAYSTACK haystackFirst,
726 FORWARD_ITR_HAYSTACK haystackLast)
const
729 typename bsl::iterator_traits<FORWARD_ITR_NEEDLE >::value_type,
730 typename bsl::iterator_traits<FORWARD_ITR_HAYSTACK>::value_type
733 return BloombergLP::bslstl::
734 DefaultSearcher_ImpUtil::doSearch<FORWARD_ITR_NEEDLE,
736 FORWARD_ITR_HAYSTACK>(
745template <
class FORWARD_ITR_NEEDLE,
class EQUAL>
750 return d_needleFirst;
753template <
class FORWARD_ITR_NEEDLE,
class EQUAL>
761template <
class FORWARD_ITR_NEEDLE,
class EQUAL>
773template <
class FORWARD_ITR_NEEDLE,
class EQUAL,
class FORWARD_ITR_HAYSTACK>
779 FORWARD_ITR_HAYSTACK>::value
782 const FORWARD_ITR_HAYSTACK& haystackFirst,
783 const FORWARD_ITR_HAYSTACK& haystackLast,
784 const FORWARD_ITR_NEEDLE& needleFirst,
785 const FORWARD_ITR_NEEDLE& needleLast,
788 BSLS_ASSERT(0 <= bsl::distance(haystackFirst, haystackLast));
790 for (FORWARD_ITR_HAYSTACK itrHaystackOuter = haystackFirst;
791 itrHaystackOuter != haystackLast;
792 ++itrHaystackOuter) {
794 FORWARD_ITR_HAYSTACK itrHaystackInner = itrHaystackOuter;
796 for (FORWARD_ITR_NEEDLE itrNeedle = needleFirst;
798 ++itrNeedle, ++itrHaystackInner) {
800 if (needleLast == itrNeedle) {
801 return std::make_pair(itrHaystackOuter,
805 if (haystackLast == itrHaystackInner) {
806 return std::make_pair(haystackLast,
810 if (equal(*itrHaystackInner, *itrNeedle)) {
820 return std::make_pair(haystackLast, haystackLast);
823template <
class FORWARD_ITR_NEEDLE,
class EQUAL,
class FORWARD_ITR_HAYSTACK>
829 FORWARD_ITR_HAYSTACK>::value
832 const FORWARD_ITR_HAYSTACK& haystackFirst,
833 const FORWARD_ITR_HAYSTACK& haystackLast,
834 const FORWARD_ITR_NEEDLE& needleFirst,
835 const FORWARD_ITR_NEEDLE& needleLast,
845 typedef typename bsl::iterator_traits<FORWARD_ITR_HAYSTACK>::
849 typedef typename bsl::iterator_traits<FORWARD_ITR_NEEDLE>::difference_type
852 const NeedleDifference needleLength = needleLast - needleFirst;
853 const HaystackDifference haystackLength = haystackLast - haystackFirst;
858 if (haystackLength < needleLength) {
859 return std::make_pair(haystackLast, haystackLast);
862 if (0 == needleLength || 0 == haystackLength) {
863 return std::make_pair(haystackFirst, haystackFirst);
866 for (FORWARD_ITR_HAYSTACK itr = haystackFirst;
867 itr < haystackLast - needleLength + 1; ++itr) {
869 FORWARD_ITR_HAYSTACK itrInner = itr;
870 FORWARD_ITR_NEEDLE needleItrInner = needleFirst;
871 NeedleDifference needleLengthInner = needleLength;
874 if (1 == needleLength) {
875 return std::make_pair(itr, itr + needleLength);
884 if (0 == std::memcmp( itrInner,
886 needleLengthInner)) {
887 return std::make_pair(itr, itr + needleLength);
892 return std::make_pair(haystackLast, haystackLast);
898#ifndef BSLS_LIBRARYFEATURES_HAS_CPP17_SEARCH_FUNCTORS
905template <
class ForwardIterator1,
906 class BinaryPredicate>
909default_searcher<ForwardIterator1,
910 BinaryPredicate>::default_searcher(ForwardIterator1 pat_first,
911 ForwardIterator1 pat_last,
912 BinaryPredicate pred)
913: d_imp(pat_first, pat_last, pred)
918template <
class ForwardIterator1,
919 class BinaryPredicate>
920template <
class ForwardIterator2>
923pair<ForwardIterator2,
925 BinaryPredicate>::operator()(
926 ForwardIterator2 first,
927 ForwardIterator2 last)
const
929 return d_imp(first, last);
Definition bslstl_defaultsearcher.h:615
default_searcher(const default_searcher &original)=default
default_searcher & operator=(BloombergLP::bslmf::MovableRef< default_searcher > rhs)=default
default_searcher(BloombergLP::bslmf::MovableRef< default_searcher > original)=default
default_searcher & operator=(const default_searcher &rhs)=default
BSLS_KEYWORD_CONSTEXPR pair< ForwardIterator2, ForwardIterator2 > operator()(ForwardIterator2 first, ForwardIterator2 last) const
Definition bslstl_defaultsearcher.h:925
~default_searcher()=default
Destroy this default_searcher object.
Definition bslstl_pair.h:1280
Definition bslstl_defaultsearcher.h:389
~DefaultSearcher()=default
Destroy this DefaultSearcher object.
DefaultSearcher & operator=(const DefaultSearcher &rhs)=default
FORWARD_ITR_NEEDLE needleFirst() const
Definition bslstl_defaultsearcher.h:747
bsl::pair< FORWARD_ITR_HAYSTACK, FORWARD_ITR_HAYSTACK > operator()(FORWARD_ITR_HAYSTACK haystackFirst, FORWARD_ITR_HAYSTACK haystackLast) const
Definition bslstl_defaultsearcher.h:724
FORWARD_ITR_NEEDLE needleLast() const
Definition bslstl_defaultsearcher.h:755
EQUAL equal() const
Definition bslstl_defaultsearcher.h:763
DefaultSearcher(DefaultSearcher &&original)=default
DefaultSearcher(const DefaultSearcher &original)=default
DefaultSearcher & operator=(DefaultSearcher &&rhs)=default
#define BSLMF_ASSERT(expr)
Definition bslmf_assert.h:231
#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_CONSTEXPR
Definition bsls_keyword.h:624
Definition bdlat_valuetypefunctions.h:939
ALLOCATOR const STRING_VIEW_LIKE_TYPE & rhs
Definition bslstl_string.h:3918
Definition bslstl_algorithm.h:84
Definition bslmf_enableif.h:530
Definition bslstl_equalto.h:316
Definition bslmf_ispointer.h:138
Definition bslmf_issame.h:146
Definition bslmf_isbitwiseequalitycomparable.h:500
Definition bslstl_defaultsearcher.h:501
@ value
Definition bslstl_defaultsearcher.h:505
Definition bslstl_defaultsearcher.h:537
static bsl::enable_if< DefaultSearcher_CanOptimize< FORWARD_ITR_NEEDLE, EQUAL, FORWARD_ITR_HAYSTACK >::value, bsl::pair< FORWARD_ITR_HAYSTACK, FORWARD_ITR_HAYSTACK > >::type doSearch(const FORWARD_ITR_HAYSTACK &haystackFirst, const FORWARD_ITR_HAYSTACK &haystackLast, const FORWARD_ITR_NEEDLE &needleFirst, const FORWARD_ITR_NEEDLE &needleLast, const EQUAL &equal)
Definition bslstl_defaultsearcher.h:781
static bsl::enable_if<!DefaultSearcher_CanOptimize< FORWARD_ITR_NEEDLE, EQUAL, FORWARD_ITR_HAYSTACK >::value, bsl::pair< FORWARD_ITR_HAYSTACK, FORWARD_ITR_HAYSTACK > >::type doSearch(const FORWARD_ITR_HAYSTACK &haystackFirst, const FORWARD_ITR_HAYSTACK &haystackLast, const FORWARD_ITR_NEEDLE &needleFirst, const FORWARD_ITR_NEEDLE &needleLast, const EQUAL &equal)