ALib C++ Framework
by
Library Version: 2605 R0
Documentation generated by doxygen
Loading...
Searching...
No Matches
search.cpp
1namespace alib { namespace strings { namespace util {
2
3template<typename TChar, lang::Case TSensitivity>
5
6template<typename TChar, lang::Case TSensitivity>
8 if (pNeedle.IsNull() ) {
9 needle.SetNull();
10 return;
11 }
12 needle.Reset( pNeedle );
13 if( needle.Length() == 0 )
14 return;
15
16 if( kmpTableLength < needle.Length() ) {
17 if( kmpTable )
18 delete[] kmpTable;
19
20 kmpTable= new integer[size_t( needle.Length() + 1 )];
21 kmpTableLength= needle.Length();
22 }
23 integer needleIdx= 0;
24 integer pfxLen= kmpTable[0]= -1;
25 for (;;) {
26 while ((pfxLen != -1) && !characters::Equal<TChar,TSensitivity>(needle.Buffer()[needleIdx], needle.Buffer()[pfxLen]))
27 pfxLen= kmpTable[pfxLen];
28 ++needleIdx;
29 if (needleIdx == needle.Length())
30 break;
31
32 ++pfxLen;
33 kmpTable[needleIdx]= characters::Equal<TChar,TSensitivity>(needle.Buffer()[needleIdx], needle.Buffer()[pfxLen]) ? kmpTable[pfxLen] : pfxLen;
34 }
35 kmpTable[needleIdx]= pfxLen;
36}
37
38template<typename TChar, lang::Case TSensitivity>
40 integer haystackIdx ) {
41 if ( needle.IsNull() )
42 return -1;
43 if ( haystackIdx < 0 ) haystackIdx= 0;
44 if ( haystackIdx + needle.Length() > haystack.Length() ) return -1;
45
46 if( needle.Length() == 0 )
47 return haystackIdx;
48
49 integer needleIdx = 0;
50 while (haystackIdx != haystack.Length()) {
51 while ((needleIdx != -1) && !characters::Equal<TChar,TSensitivity>( haystack.Buffer()[haystackIdx],
52 needle .Buffer()[needleIdx] ) )
53 needleIdx= kmpTable[needleIdx];
54 ++haystackIdx;
55 ++needleIdx;
56 if ( needleIdx >= needle.Length() )
57 return (haystackIdx - needleIdx);
58 }
59
60 return -1;
61}
62
63//! @cond NO_DOX
80//! @endcond
81
82
83}}} // namespace [alib::strings::util]
constexpr integer Length() const
Definition string.hpp:300
constexpr const TChar * Buffer() const
Definition string.hpp:295
constexpr bool IsNull() const
Definition string.hpp:334
TStringSearch(const TString< TChar > &pNeedle=nullptr)
Definition search.hpp:42
TAString< TChar, lang::HeapAllocator > needle
The needle set Knuth-Morris-Pratt prefix length table.
Definition search.hpp:28
integer kmpTableLength
Length of #"kmpTable".
Definition search.hpp:34
void Compile(const TString< TChar > &needle)
Definition search.cpp:7
integer Search(const TString< TChar > &haystack, integer startIdx=0)
Definition search.cpp:39
integer * kmpTable
The Knuth-Morris-Pratt prefix length table.
Definition search.hpp:31
bool Equal(TChar lhs, TRhs rhs)
Definition functions.hpp:62
Definition alox.cpp:14
lang::integer integer
Type alias in namespace #"%alib".
Definition integers.hpp:149