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