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.
21const int32_t SimpleFwdCharIterator::kInvalidHashCode = 0;
22const int32_t SimpleFwdCharIterator::kEmptyHashCode = 1;
23
24#if 0 // not used
25SimpleFwdCharIterator::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
42SimpleFwdCharIterator::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
66SimpleFwdCharIterator::~SimpleFwdCharIterator() {
67    delete[] fStart;
68}
69
70#if 0 // not used
71UBool 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
92int32_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
102UClassID SimpleFwdCharIterator::getDynamicClassID(void) const {
103    return NULL;
104}
105
106UChar SimpleFwdCharIterator::nextPostInc(void) {
107    if(fCurrent == fEnd) {
108        return ForwardCharacterIterator::DONE;
109    } else {
110        return *(fCurrent)++;
111    }
112}
113
114UChar32 SimpleFwdCharIterator::next32PostInc(void) {
115    return ForwardCharacterIterator::DONE;
116}
117
118UBool SimpleFwdCharIterator::hasNext() {
119    return fCurrent < fEnd;
120}
121