Hex Artifact Content

Not logged in

Artifact b90c4013c91b1e31511e06d83cb49df7b228d192:


0000: 23 69 66 6e 64 65 66 20 41 46 58 5f 4e 53 45 41  #ifndef AFX_NSEA
0010: 52 43 48 5f 48 5f 5f 38 33 33 36 45 31 33 33 5f  RCH_H__8336E133_
0020: 39 30 43 35 5f 34 30 35 39 5f 38 36 30 35 5f 36  90C5_4059_8605_6
0030: 30 36 36 42 44 33 37 44 30 34 32 5f 5f 49 4e 43  066BD37D042__INC
0040: 4c 55 44 45 44 5f 0d 0a 23 64 65 66 69 6e 65 20  LUDED_..#define 
0050: 41 46 58 5f 4e 53 45 41 52 43 48 5f 48 5f 5f 38  AFX_NSEARCH_H__8
0060: 33 33 36 45 31 33 33 5f 39 30 43 35 5f 34 30 35  336E133_90C5_405
0070: 39 5f 38 36 30 35 5f 36 30 36 36 42 44 33 37 44  9_8605_6066BD37D
0080: 30 34 32 5f 5f 49 4e 43 4c 55 44 45 44 5f 0d 0a  042__INCLUDED_..
0090: 23 69 6e 63 6c 75 64 65 20 22 53 65 61 72 63 68  #include "Search
00a0: 2e 68 22 0d 0a 0d 0a 0d 0a 0d 0a 2f 2f 3d 3d 3d  .h"........//===
00b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
00c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
00d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
00e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
00f0: 3d 3d 3d 3d 3d 3d 0d 0a 2f 2f 40 7b 20 40 70 6b  ======..//@{ @pk
0100: 67 20 47 70 2e 53 65 61 72 63 68 20 2f 2f 40 7d  g Gp.Search //@}
0110: 0d 0a 2f 2f 20 42 4d 96 40 8c 9f 8d f5 97 70 83  ..// BM.@.....p.
0120: 7c 83 8a 83 56 81 5b 73 0d 0a 2f 2f 3d 3d 3d 3d  |...V.[s..//====
0130: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0140: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0150: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0160: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0170: 3d 3d 3d 3d 3d 0d 0a 0d 0a 2f 2f 40 7b 20 91 e5  =====....//@{ ..
0180: 95 b6 8e 9a 8f ac 95 b6 8e 9a 82 f0 8b e6 95 ca  ................
0190: 82 b7 82 e9 83 7c 83 8a 83 56 81 5b 20 2f 2f 40  .....|...V.[ //@
01a0: 7d 0d 0a 73 74 72 75 63 74 20 43 61 73 65 53 65  }..struct CaseSe
01b0: 6e 73 69 74 69 76 65 0d 0a 7b 0d 0a 09 73 74 61  nsitive..{...sta
01c0: 74 69 63 20 75 6e 69 63 6f 64 65 20 6d 61 70 28  tic unicode map(
01d0: 20 75 6e 69 63 6f 64 65 20 63 20 29 0d 0a 09 09   unicode c )....
01e0: 7b 20 72 65 74 75 72 6e 20 63 3b 20 7d 0d 0a 09  { return c; }...
01f0: 73 74 61 74 69 63 20 62 6f 6f 6c 20 6e 6f 74 5f  static bool not_
0200: 65 71 75 61 6c 28 20 75 6e 69 63 6f 64 65 20 63  equal( unicode c
0210: 31 2c 20 75 6e 69 63 6f 64 65 20 63 32 20 29 0d  1, unicode c2 ).
0220: 0a 09 09 7b 20 72 65 74 75 72 6e 20 63 31 21 3d  ...{ return c1!=
0230: 63 32 3b 20 7d 0d 0a 7d 3b 0d 0a 0d 0a 2f 2f 40  c2; }..};....//@
0240: 7b 20 91 e5 95 b6 8e 9a 8f ac 95 b6 8e 9a 82 f0  { ..............
0250: 8b e6 95 ca 82 b5 82 c8 82 a2 83 7c 83 8a 83 56  ...........|...V
0260: 81 5b 20 2f 2f 40 7d 0d 0a 73 74 72 75 63 74 20  .[ //@}..struct 
0270: 49 67 6e 6f 72 65 43 61 73 65 0d 0a 7b 0d 0a 09  IgnoreCase..{...
0280: 73 74 61 74 69 63 20 75 6e 69 63 6f 64 65 20 6d  static unicode m
0290: 61 70 28 20 75 6e 69 63 6f 64 65 20 63 20 29 0d  ap( unicode c ).
02a0: 0a 09 09 7b 20 72 65 74 75 72 6e 20 28 4c 27 61  ...{ return (L'a
02b0: 27 3c 3d 63 20 26 26 20 63 3c 3d 4c 27 7a 27 20  '<=c && c<=L'z' 
02c0: 3f 20 63 2d 4c 27 61 27 2b 4c 27 41 27 20 3a 20  ? c-L'a'+L'A' : 
02d0: 63 29 3b 20 7d 0d 0a 09 73 74 61 74 69 63 20 62  c); }...static b
02e0: 6f 6f 6c 20 6e 6f 74 5f 65 71 75 61 6c 28 20 75  ool not_equal( u
02f0: 6e 69 63 6f 64 65 20 63 31 2c 20 75 6e 69 63 6f  nicode c1, unico
0300: 64 65 20 63 32 20 29 0d 0a 09 09 7b 20 72 65 74  de c2 )....{ ret
0310: 75 72 6e 20 6d 61 70 28 63 31 29 21 3d 6d 61 70  urn map(c1)!=map
0320: 28 63 32 29 3b 20 7d 0d 0a 7d 3b 0d 0a 0d 0a 0d  (c2); }..};.....
0330: 0a 0d 0a 2f 2f 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ...//===========
0340: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0350: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0360: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0370: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0d 0a  ==============..
0380: 2f 2f 40 7b 0d 0a 2f 2f 09 42 4d 96 40 82 c9 82  //@{..//.BM.@...
0390: e6 82 e9 95 81 92 ca 82 cc 90 b3 95 fb 8c fc 8c  ................
03a0: 9f 8d f5 0d 0a 2f 2f 40 7d 0d 0a 2f 2f 3d 3d 3d  .....//@}..//===
03b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
03c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
03d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
03e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
03f0: 3d 3d 3d 3d 3d 3d 0d 0a 0d 0a 74 65 6d 70 6c 61  ======....templa
0400: 74 65 3c 63 6c 61 73 73 20 43 6f 6d 70 61 72 69  te<class Compari
0410: 73 6f 6e 50 6f 6c 69 63 79 3e 20 63 6c 61 73 73  sonPolicy> class
0420: 20 42 4d 53 65 61 72 63 68 0d 0a 7b 0d 0a 70 75   BMSearch..{..pu
0430: 62 6c 69 63 3a 0d 0a 09 42 4d 53 65 61 72 63 68  blic:...BMSearch
0440: 28 20 63 6f 6e 73 74 20 75 6e 69 63 6f 64 65 2a  ( const unicode*
0450: 20 6b 65 79 20 29 0d 0a 09 09 3a 20 6b 65 79 6c   key )....: keyl
0460: 65 6e 5f 28 20 6d 79 5f 6c 73 74 72 6c 65 6e 57  en_( my_lstrlenW
0470: 28 6b 65 79 29 20 29 0d 0a 09 09 2c 20 6b 65 79  (key) )...., key
0480: 5f 28 20 6d 79 5f 6c 73 74 72 63 70 79 57 28 20  _( my_lstrcpyW( 
0490: 6e 65 77 20 75 6e 69 63 6f 64 65 5b 6b 65 79 6c  new unicode[keyl
04a0: 65 6e 5f 2b 31 5d 2c 20 6b 65 79 20 29 20 29 0d  en_+1], key ) ).
04b0: 0a 09 7b 0d 0a 09 09 6d 65 6d 46 46 28 20 6c 61  ..{....memFF( la
04c0: 73 74 41 70 70 65 61 72 61 6e 63 65 5f 2c 20 73  stAppearance_, s
04d0: 69 7a 65 6f 66 28 6c 61 73 74 41 70 70 65 61 72  izeof(lastAppear
04e0: 61 6e 63 65 5f 29 20 29 3b 0d 0a 09 09 66 6f 72  ance_) );....for
04f0: 28 20 69 6e 74 20 69 3d 30 2c 20 65 3d 6b 65 79  ( int i=0, e=key
0500: 6c 65 6e 5f 3b 20 69 3c 65 3b 20 2b 2b 69 20 29  len_; i<e; ++i )
0510: 0d 0a 09 09 09 6c 61 73 74 41 70 70 65 61 72 61  .....lastAppeara
0520: 6e 63 65 5f 5b 20 43 6f 6d 70 61 72 69 73 6f 6e  nce_[ Comparison
0530: 50 6f 6c 69 63 79 3a 3a 6d 61 70 28 6b 65 79 5b  Policy::map(key[
0540: 69 5d 29 20 5d 20 3d 20 69 3b 0d 0a 09 7d 0d 0a  i]) ] = i;...}..
0550: 0d 0a 09 7e 42 4d 53 65 61 72 63 68 28 29 0d 0a  ...~BMSearch()..
0560: 09 7b 0d 0a 09 09 64 65 6c 65 74 65 20 5b 5d 20  .{....delete [] 
0570: 6b 65 79 5f 3b 0d 0a 09 7d 0d 0a 0d 0a 09 69 6e  key_;...}.....in
0580: 74 20 53 65 61 72 63 68 28 20 63 6f 6e 73 74 20  t Search( const 
0590: 75 6e 69 63 6f 64 65 2a 20 73 74 72 2c 20 69 6e  unicode* str, in
05a0: 74 20 73 74 72 6c 65 6e 20 29 0d 0a 09 7b 0d 0a  t strlen )...{..
05b0: 09 09 66 6f 72 28 20 69 6e 74 20 69 3d 30 2c 20  ..for( int i=0, 
05c0: 65 3d 73 74 72 6c 65 6e 2d 6b 65 79 6c 65 6e 5f  e=strlen-keylen_
05d0: 2c 20 6a 2c 20 74 3b 20 69 3c 3d 65 3b 20 69 2b  , j, t; i<=e; i+
05e0: 3d 28 6a 3e 74 3f 6a 2d 74 3a 31 29 20 29 0d 0a  =(j>t?j-t:1) )..
05f0: 09 09 7b 0d 0a 09 09 09 66 6f 72 28 20 6a 3d 6b  ..{.....for( j=k
0600: 65 79 6c 65 6e 5f 2d 31 3b 20 6a 3e 3d 30 3b 20  eylen_-1; j>=0; 
0610: 2d 2d 6a 20 29 0d 0a 09 09 09 7b 0d 0a 09 09 09  --j ).....{.....
0620: 09 69 66 28 20 43 6f 6d 70 61 72 69 73 6f 6e 50  .if( ComparisonP
0630: 6f 6c 69 63 79 3a 3a 6e 6f 74 5f 65 71 75 61 6c  olicy::not_equal
0640: 28 20 6b 65 79 5f 5b 6a 5d 2c 20 73 74 72 5b 69  ( key_[j], str[i
0650: 2b 6a 5d 20 29 20 29 0d 0a 09 09 09 09 09 62 72  +j] ) ).......br
0660: 65 61 6b 3b 0d 0a 09 09 09 7d 0d 0a 09 09 09 69  eak;.....}.....i
0670: 66 28 20 6a 20 3c 20 30 20 29 0d 0a 09 09 09 09  f( j < 0 )......
0680: 72 65 74 75 72 6e 20 69 3b 0d 0a 09 09 09 74 20  return i;.....t 
0690: 3d 20 6c 61 73 74 41 70 70 65 61 72 61 6e 63 65  = lastAppearance
06a0: 5f 5b 20 43 6f 6d 70 61 72 69 73 6f 6e 50 6f 6c  _[ ComparisonPol
06b0: 69 63 79 3a 3a 6d 61 70 28 73 74 72 5b 69 2b 6a  icy::map(str[i+j
06c0: 5d 29 20 5d 3b 0d 0a 09 09 7d 0d 0a 09 09 72 65  ]) ];....}....re
06d0: 74 75 72 6e 20 2d 31 3b 0d 0a 09 7d 0d 0a 0d 0a  turn -1;...}....
06e0: 09 69 6e 74 20 6b 65 79 6c 65 6e 28 29 20 63 6f  .int keylen() co
06f0: 6e 73 74 20 7b 20 72 65 74 75 72 6e 20 6b 65 79  nst { return key
0700: 6c 65 6e 5f 3b 20 7d 0d 0a 0d 0a 70 72 69 76 61  len_; }....priva
0710: 74 65 3a 0d 0a 09 69 6e 74 20 20 20 20 20 20 6b  te:...int      k
0720: 65 79 6c 65 6e 5f 3b 0d 0a 09 75 6e 69 63 6f 64  eylen_;...unicod
0730: 65 2a 20 6b 65 79 5f 3b 0d 0a 09 69 6e 74 20 20  e* key_;...int  
0740: 20 20 20 20 6c 61 73 74 41 70 70 65 61 72 61 6e      lastAppearan
0750: 63 65 5f 5b 36 35 35 33 36 5d 3b 0d 0a 7d 3b 0d  ce_[65536];..};.
0760: 0a 0d 0a 0d 0a 0d 0a 2f 2f 3d 3d 3d 3d 3d 3d 3d  .......//=======
0770: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0780: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0790: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
07a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
07b0: 3d 3d 0d 0a 2f 2f 40 7b 0d 0a 2f 2f 09 42 4d 96  ==..//@{..//.BM.
07c0: 40 82 c9 82 e6 82 e9 8b 74 95 fb 8c fc 8c 9f 8d  @.......t.......
07d0: f5 0d 0a 2f 2f 40 7d 0d 0a 2f 2f 3d 3d 3d 3d 3d  ...//@}..//=====
07e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
07f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0800: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0810: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0820: 3d 3d 3d 3d 0d 0a 0d 0a 74 65 6d 70 6c 61 74 65  ====....template
0830: 3c 63 6c 61 73 73 20 43 6f 6d 70 61 72 69 73 6f  <class Compariso
0840: 6e 50 6f 6c 69 63 79 3e 20 63 6c 61 73 73 20 42  nPolicy> class B
0850: 4d 53 65 61 72 63 68 52 65 76 0d 0a 7b 0d 0a 70  MSearchRev..{..p
0860: 75 62 6c 69 63 3a 0d 0a 09 42 4d 53 65 61 72 63  ublic:...BMSearc
0870: 68 52 65 76 28 20 63 6f 6e 73 74 20 75 6e 69 63  hRev( const unic
0880: 6f 64 65 2a 20 6b 65 79 20 29 0d 0a 09 09 3a 20  ode* key )....: 
0890: 6b 65 79 6c 65 6e 5f 28 20 6d 79 5f 6c 73 74 72  keylen_( my_lstr
08a0: 6c 65 6e 57 28 6b 65 79 29 20 29 0d 0a 09 09 2c  lenW(key) )....,
08b0: 20 6b 65 79 5f 28 20 6d 79 5f 6c 73 74 72 63 70   key_( my_lstrcp
08c0: 79 57 28 20 6e 65 77 20 75 6e 69 63 6f 64 65 5b  yW( new unicode[
08d0: 6b 65 79 6c 65 6e 5f 2b 31 5d 2c 20 6b 65 79 20  keylen_+1], key 
08e0: 29 20 29 0d 0a 09 7b 0d 0a 09 09 6d 65 6d 46 46  ) )...{....memFF
08f0: 28 20 66 69 72 73 74 41 70 70 65 61 72 61 6e 63  ( firstAppearanc
0900: 65 5f 2c 20 73 69 7a 65 6f 66 28 66 69 72 73 74  e_, sizeof(first
0910: 41 70 70 65 61 72 61 6e 63 65 5f 29 20 29 3b 0d  Appearance_) );.
0920: 0a 09 09 66 6f 72 28 20 69 6e 74 20 69 3d 6b 65  ...for( int i=ke
0930: 79 6c 65 6e 5f 2d 31 3b 20 69 3e 3d 30 3b 20 2d  ylen_-1; i>=0; -
0940: 2d 69 20 29 0d 0a 09 09 09 66 69 72 73 74 41 70  -i ).....firstAp
0950: 70 65 61 72 61 6e 63 65 5f 5b 20 43 6f 6d 70 61  pearance_[ Compa
0960: 72 69 73 6f 6e 50 6f 6c 69 63 79 3a 3a 6d 61 70  risonPolicy::map
0970: 28 6b 65 79 5b 69 5d 29 20 5d 20 3d 20 69 3b 0d  (key[i]) ] = i;.
0980: 0a 09 7d 0d 0a 0d 0a 09 7e 42 4d 53 65 61 72 63  ..}.....~BMSearc
0990: 68 52 65 76 28 29 0d 0a 09 7b 0d 0a 09 09 64 65  hRev()...{....de
09a0: 6c 65 74 65 20 5b 5d 20 6b 65 79 5f 3b 0d 0a 09  lete [] key_;...
09b0: 7d 0d 0a 0d 0a 09 69 6e 74 20 53 65 61 72 63 68  }.....int Search
09c0: 28 20 63 6f 6e 73 74 20 75 6e 69 63 6f 64 65 2a  ( const unicode*
09d0: 20 73 74 72 2c 20 69 6e 74 20 73 74 72 6c 65 6e   str, int strlen
09e0: 20 29 0d 0a 09 7b 0d 0a 09 09 66 6f 72 28 20 69   )...{....for( i
09f0: 6e 74 20 69 3d 73 74 72 6c 65 6e 2d 6b 65 79 6c  nt i=strlen-keyl
0a00: 65 6e 5f 2d 31 2c 20 6a 2c 20 65 2c 20 74 3b 20  en_-1, j, e, t; 
0a10: 69 3e 3d 30 3b 20 69 2d 3d 28 74 3e 6a 3f 74 2d  i>=0; i-=(t>j?t-
0a20: 6a 3a 31 29 20 29 0d 0a 09 09 7b 0d 0a 09 09 09  j:1) )....{.....
0a30: 66 6f 72 28 20 6a 3d 30 2c 20 65 3d 6b 65 79 6c  for( j=0, e=keyl
0a40: 65 6e 5f 3b 20 6a 3c 65 3b 20 2b 2b 6a 20 29 0d  en_; j<e; ++j ).
0a50: 0a 09 09 09 09 69 66 28 20 43 6f 6d 70 61 72 69  .....if( Compari
0a60: 73 6f 6e 50 6f 6c 69 63 79 3a 3a 6e 6f 74 5f 65  sonPolicy::not_e
0a70: 71 75 61 6c 28 20 6b 65 79 5f 5b 6a 5d 2c 20 73  qual( key_[j], s
0a80: 74 72 5b 69 2b 6a 5d 20 29 20 29 0d 0a 09 09 09  tr[i+j] ) ).....
0a90: 09 09 62 72 65 61 6b 3b 0d 0a 09 09 09 69 66 28  ..break;.....if(
0aa0: 20 6a 20 3e 3d 20 65 20 29 0d 0a 09 09 09 09 72   j >= e )......r
0ab0: 65 74 75 72 6e 20 69 3b 0d 0a 09 09 09 74 20 3d  eturn i;.....t =
0ac0: 20 66 69 72 73 74 41 70 70 65 61 72 61 6e 63 65   firstAppearance
0ad0: 5f 5b 20 43 6f 6d 70 61 72 69 73 6f 6e 50 6f 6c  _[ ComparisonPol
0ae0: 69 63 79 3a 3a 6d 61 70 28 73 74 72 5b 69 2b 6a  icy::map(str[i+j
0af0: 5d 29 20 5d 3b 0d 0a 09 09 09 69 66 28 20 74 20  ]) ];.....if( t 
0b00: 3d 3d 20 2d 31 20 29 20 74 20 3d 20 6b 65 79 6c  == -1 ) t = keyl
0b10: 65 6e 5f 3b 0d 0a 09 09 7d 0d 0a 09 09 72 65 74  en_;....}....ret
0b20: 75 72 6e 20 2d 31 3b 0d 0a 09 7d 0d 0a 0d 0a 09  urn -1;...}.....
0b30: 69 6e 74 20 6b 65 79 6c 65 6e 28 29 20 63 6f 6e  int keylen() con
0b40: 73 74 20 7b 20 72 65 74 75 72 6e 20 6b 65 79 6c  st { return keyl
0b50: 65 6e 5f 3b 20 7d 0d 0a 0d 0a 70 72 69 76 61 74  en_; }....privat
0b60: 65 3a 0d 0a 09 69 6e 74 20 20 20 20 20 20 6b 65  e:...int      ke
0b70: 79 6c 65 6e 5f 3b 0d 0a 09 75 6e 69 63 6f 64 65  ylen_;...unicode
0b80: 2a 20 6b 65 79 5f 3b 0d 0a 09 69 6e 74 20 20 20  * key_;...int   
0b90: 20 20 20 66 69 72 73 74 41 70 70 65 61 72 61 6e     firstAppearan
0ba0: 63 65 5f 5b 36 35 35 33 36 5d 3b 0d 0a 7d 3b 0d  ce_[65536];..};.
0bb0: 0a 0d 0a 0d 0a 0d 0a 2f 2f 3d 3d 3d 3d 3d 3d 3d  .......//=======
0bc0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0bd0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0be0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0bf0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0c00: 3d 3d 0d 0a 2f 2f 40 7b 0d 0a 2f 2f 20 53 65 61  ==..//@{..// Sea
0c10: 72 68 63 61 62 6c 65 82 c6 82 b5 82 c4 82 cc 8e  rhcable.........
0c20: c0 91 95 81 69 90 b3 95 fb 8c fc 8c 9f 8d f5 81  ....i...........
0c30: 6a 0d 0a 2f 2f 40 7d 0d 0a 2f 2f 3d 3d 3d 3d 3d  j..//@}..//=====
0c40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0c50: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0c60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0c70: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0c80: 3d 3d 3d 3d 0d 0a 0d 0a 74 65 6d 70 6c 61 74 65  ====....template
0c90: 3c 63 6c 61 73 73 20 43 6f 6d 70 61 6c 69 73 6f  <class Compaliso
0ca0: 6e 50 6f 6c 69 63 79 3e 0d 0a 63 6c 61 73 73 20  nPolicy>..class 
0cb0: 4e 53 65 61 72 63 68 20 3a 20 70 75 62 6c 69 63  NSearch : public
0cc0: 20 53 65 61 72 63 68 61 62 6c 65 0d 0a 7b 0d 0a   Searchable..{..
0cd0: 70 75 62 6c 69 63 3a 0d 0a 09 4e 53 65 61 72 63  public:...NSearc
0ce0: 68 28 20 63 6f 6e 73 74 20 75 6e 69 63 6f 64 65  h( const unicode
0cf0: 2a 20 6b 65 79 20 29 20 3a 20 73 5f 28 6b 65 79  * key ) : s_(key
0d00: 29 20 7b 7d 0d 0a 0d 0a 70 72 69 76 61 74 65 3a  ) {}....private:
0d10: 0d 0a 09 62 6f 6f 6c 20 53 65 61 72 63 68 28 0d  ...bool Search(.
0d20: 0a 09 09 63 6f 6e 73 74 20 75 6e 69 63 6f 64 65  ...const unicode
0d30: 2a 20 73 74 72 2c 20 75 6c 6f 6e 67 20 6c 65 6e  * str, ulong len
0d40: 2c 20 75 6c 6f 6e 67 20 73 74 74 2c 20 75 6c 6f  , ulong stt, ulo
0d50: 6e 67 2a 20 6d 62 67 2c 20 75 6c 6f 6e 67 2a 20  ng* mbg, ulong* 
0d60: 6d 65 64 20 29 0d 0a 09 7b 0d 0a 09 09 69 6e 74  med )...{....int
0d70: 20 6e 20 3d 20 73 5f 2e 53 65 61 72 63 68 28 20   n = s_.Search( 
0d80: 73 74 72 2b 73 74 74 2c 20 6c 65 6e 2d 73 74 74  str+stt, len-stt
0d90: 20 29 3b 0d 0a 09 09 69 66 28 20 6e 20 3c 20 30   );....if( n < 0
0da0: 20 29 0d 0a 09 09 09 72 65 74 75 72 6e 20 66 61   ).....return fa
0db0: 6c 73 65 3b 0d 0a 09 09 2a 6d 62 67 20 3d 20 73  lse;....*mbg = s
0dc0: 74 74 20 2b 20 6e 3b 0d 0a 09 09 2a 6d 65 64 20  tt + n;....*med 
0dd0: 3d 20 73 74 74 20 2b 20 6e 20 2b 20 73 5f 2e 6b  = stt + n + s_.k
0de0: 65 79 6c 65 6e 28 29 3b 0d 0a 09 09 72 65 74 75  eylen();....retu
0df0: 72 6e 20 74 72 75 65 3b 0d 0a 09 7d 0d 0a 0d 0a  rn true;...}....
0e00: 70 72 69 76 61 74 65 3a 0d 0a 09 42 4d 53 65 61  private:...BMSea
0e10: 72 63 68 3c 43 6f 6d 70 61 6c 69 73 6f 6e 50 6f  rch<CompalisonPo
0e20: 6c 69 63 79 3e 20 73 5f 3b 0d 0a 7d 3b 0d 0a 0d  licy> s_;..};...
0e30: 0a 0d 0a 0d 0a 2f 2f 3d 3d 3d 3d 3d 3d 3d 3d 3d  .....//=========
0e40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0e50: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0e60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0e70: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0e80: 0d 0a 2f 2f 40 7b 0d 0a 2f 2f 20 53 65 61 72 68  ..//@{..// Searh
0e90: 63 61 62 6c 65 82 c6 82 b5 82 c4 82 cc 8e c0 91  cable...........
0ea0: 95 81 69 8b 74 95 fb 8c fc 8c 9f 8d f5 81 6a 0d  ..i.t.........j.
0eb0: 0a 2f 2f 40 7d 0d 0a 2f 2f 3d 3d 3d 3d 3d 3d 3d  .//@}..//=======
0ec0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0ed0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0ee0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0ef0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0f00: 3d 3d 0d 0a 0d 0a 74 65 6d 70 6c 61 74 65 3c 63  ==....template<c
0f10: 6c 61 73 73 20 43 6f 6d 70 61 6c 69 73 6f 6e 50  lass CompalisonP
0f20: 6f 6c 69 63 79 3e 0d 0a 63 6c 61 73 73 20 4e 53  olicy>..class NS
0f30: 65 61 72 63 68 52 65 76 20 3a 20 70 75 62 6c 69  earchRev : publi
0f40: 63 20 53 65 61 72 63 68 61 62 6c 65 0d 0a 7b 0d  c Searchable..{.
0f50: 0a 70 75 62 6c 69 63 3a 0d 0a 09 4e 53 65 61 72  .public:...NSear
0f60: 63 68 52 65 76 28 20 63 6f 6e 73 74 20 75 6e 69  chRev( const uni
0f70: 63 6f 64 65 2a 20 6b 65 79 20 29 20 3a 20 73 5f  code* key ) : s_
0f80: 28 6b 65 79 29 20 7b 7d 0d 0a 0d 0a 70 72 69 76  (key) {}....priv
0f90: 61 74 65 3a 0d 0a 09 62 6f 6f 6c 20 53 65 61 72  ate:...bool Sear
0fa0: 63 68 28 0d 0a 09 09 63 6f 6e 73 74 20 75 6e 69  ch(....const uni
0fb0: 63 6f 64 65 2a 20 73 74 72 2c 20 75 6c 6f 6e 67  code* str, ulong
0fc0: 20 6c 65 6e 2c 20 75 6c 6f 6e 67 20 73 74 74 2c   len, ulong stt,
0fd0: 20 75 6c 6f 6e 67 2a 20 6d 62 67 2c 20 75 6c 6f   ulong* mbg, ulo
0fe0: 6e 67 2a 20 6d 65 64 20 29 0d 0a 09 7b 0d 0a 09  ng* med )...{...
0ff0: 09 69 6e 74 20 6e 20 3d 20 73 5f 2e 53 65 61 72  .int n = s_.Sear
1000: 63 68 28 20 73 74 72 2c 20 73 74 74 2b 73 5f 2e  ch( str, stt+s_.
1010: 6b 65 79 6c 65 6e 28 29 20 29 3b 0d 0a 09 09 69  keylen() );....i
1020: 66 28 20 6e 20 3c 20 30 20 29 0d 0a 09 09 09 72  f( n < 0 ).....r
1030: 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 09 09  eturn false;....
1040: 2a 6d 62 67 20 3d 20 6e 3b 0d 0a 09 09 2a 6d 65  *mbg = n;....*me
1050: 64 20 3d 20 6e 20 2b 20 73 5f 2e 6b 65 79 6c 65  d = n + s_.keyle
1060: 6e 28 29 3b 0d 0a 09 09 72 65 74 75 72 6e 20 74  n();....return t
1070: 72 75 65 3b 0d 0a 09 7d 0d 0a 0d 0a 70 72 69 76  rue;...}....priv
1080: 61 74 65 3a 0d 0a 09 42 4d 53 65 61 72 63 68 52  ate:...BMSearchR
1090: 65 76 3c 43 6f 6d 70 61 6c 69 73 6f 6e 50 6f 6c  ev<CompalisonPol
10a0: 69 63 79 3e 20 73 5f 3b 0d 0a 7d 3b 0d 0a 0d 0a  icy> s_;..};....
10b0: 0d 0a 0d 0a 2f 2f 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ....//==========
10c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
10d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
10e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
10f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0d  ===============.
1100: 0a 0d 0a 23 65 6e 64 69 66 0d 0a                 ...#endif..