1 /******************************************************************** 2 * COPYRIGHT: 3 * Copyright (c) 1997-2003, International Business Machines Corporation and 4 * others. All Rights Reserved. 5 ********************************************************************/ 6 /* file name: sfwdchit.cpp 7 * encoding: US-ASCII 8 * tab size: 8 (not used) 9 * indentation:4 10 */ 11 12 #include "sfwdchit.h" 13 #include "unicode/ustring.h" 14 #include "unicode/unistr.h" 15 #include "uhash.h" 16 #include "cmemory.h" 17 18 // A hash code of kInvalidHashCode indicates that the has code needs 19 // to be computed. A hash code of kEmptyHashCode is used for empty keys 20 // and for any key whose computed hash code is kInvalidHashCode. 21 const int32_t SimpleFwdCharIterator::kInvalidHashCode = 0; 22 const int32_t SimpleFwdCharIterator::kEmptyHashCode = 1; 23 24 #if 0 // not used 25 SimpleFwdCharIterator::SimpleFwdCharIterator(const UnicodeString& s) { 26 27 fHashCode = kInvalidHashCode; 28 fLen = s.length(); 29 fStart = new UChar[fLen]; 30 if(fStart == NULL) { 31 fBogus = TRUE; 32 } else { 33 fEnd = fStart+fLen; 34 fCurrent = fStart; 35 fBogus = FALSE; 36 s.extract(0, fLen, fStart); 37 } 38 39 } 40 #endif 41 42 SimpleFwdCharIterator::SimpleFwdCharIterator(UChar *s, int32_t len, UBool adopt) { 43 44 fHashCode = kInvalidHashCode; 45 46 fLen = len==-1 ? u_strlen(s) : len; 47 48 if(adopt == FALSE) { 49 fStart = new UChar[fLen]; 50 if(fStart == NULL) { 51 fBogus = TRUE; 52 } else { 53 uprv_memcpy(fStart, s, fLen); 54 fEnd = fStart+fLen; 55 fCurrent = fStart; 56 fBogus = FALSE; 57 } 58 } else { // adopt = TRUE 59 fCurrent = fStart = s; 60 fEnd = fStart + fLen; 61 fBogus = FALSE; 62 } 63 64 } 65 66 SimpleFwdCharIterator::~SimpleFwdCharIterator() { 67 delete[] fStart; 68 } 69 70 #if 0 // not used 71 UBool SimpleFwdCharIterator::operator==(const ForwardCharacterIterator& that) const { 72 if(this == &that) { 73 return TRUE; 74 } 75 /* 76 if(that->fHashCode != kInvalidHashCode && this->fHashCode = that->fHashCode) { 77 return TRUE; 78 } 79 80 if(this->fStart == that->fStart) { 81 return TRUE; 82 } 83 84 if(this->fLen == that->fLen && uprv_memcmp(this->fStart, that->fStart, this->fLen) { 85 return TRUE; 86 } 87 */ 88 return FALSE; 89 } 90 #endif 91 92 int32_t SimpleFwdCharIterator::hashCode(void) const { 93 if (fHashCode == kInvalidHashCode) 94 { 95 UHashTok key; 96 key.pointer = fStart; 97 ((SimpleFwdCharIterator *)this)->fHashCode = uhash_hashUChars(key); 98 } 99 return fHashCode; 100 } 101 102 UClassID SimpleFwdCharIterator::getDynamicClassID(void) const { 103 return NULL; 104 } 105 106 UChar SimpleFwdCharIterator::nextPostInc(void) { 107 if(fCurrent == fEnd) { 108 return ForwardCharacterIterator::DONE; 109 } else { 110 return *(fCurrent)++; 111 } 112 } 113 114 UChar32 SimpleFwdCharIterator::next32PostInc(void) { 115 return ForwardCharacterIterator::DONE; 116 } 117 118 UBool SimpleFwdCharIterator::hasNext() { 119 return fCurrent < fEnd; 120 } 121