Viewing file: citer.cpp (5.42 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
/* ******************************************************************************* * * © 2016 and later: Unicode, Inc. and others. * License & terms of use: http://www.unicode.org/copyright.html#License * ******************************************************************************* ******************************************************************************* * * Copyright (C) 2002-2011, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* */
#include "unicode/uchriter.h" #include "unicode/schriter.h" #include "unicode/ustring.h" #include <stdio.h> #include <unicode/brkiter.h> #include <unicode/ustdio.h> #include <stdlib.h>
static UFILE *out;
using icu::CharacterIterator; using icu::StringCharacterIterator; using icu::UCharCharacterIterator; using icu::UnicodeString;
void printUnicodeString(const UnicodeString &s) { u_fprintf(out, "%S", &s); }
void printUChar(UChar32 ch) { if(ch < 127) { u_fprintf(out, "%C", (UChar) ch); } else if (ch == CharacterIterator::DONE) { u_fprintf(out, "[CharacterIterator::DONE = 0xFFFF]"); } else { u_fprintf(out, "[%X]", ch); } }
class Test { public: void TestUChariter(); void TestStringiter(); };
void Test::TestUChariter() { const char testChars[] = "Now is the time for all good men to come " "to the aid of their country.";
UnicodeString testString(testChars,""); const UChar *testText = testString.getTerminatedBuffer();
UCharCharacterIterator iter(testText, u_strlen(testText)); UCharCharacterIterator* test2 = iter.clone();
u_fprintf(out, "testText = %s", testChars);
if (iter != *test2 ) { u_fprintf(out, "clone() or equals() failed: Two clones tested unequal\n"); }
UnicodeString result1, result2; // getting and comparing the text within the iterators iter.getText(result1); test2->getText(result2); if (result1 != result2) { u_fprintf(out, "iter.getText() != clone.getText()\n"); }
u_fprintf(out, "\n");
// Demonstrates seeking forward using the iterator. u_fprintf(out, "Forward = ");
UChar c = iter.first(); printUChar(c); // The first char int32_t i = 0;
if (iter.startIndex() != 0 || iter.endIndex() != u_strlen(testText)) { u_fprintf(out, "startIndex() or endIndex() failed\n"); }
// Testing forward iteration... do { if (c == CharacterIterator::DONE && i != u_strlen(testText)) { u_fprintf(out, "Iterator reached end prematurely"); } else if (c != testText[i]) { u_fprintf(out, "Character mismatch at position %d\n" + i); } if (iter.current() != c) { u_fprintf(out, "current() isn't working right"); } if (iter.getIndex() != i) { u_fprintf(out, "getIndex() isn't working right\n"); } if (c != CharacterIterator::DONE) { c = iter.next(); i++; }
u_fprintf(out, "|"); printUChar(c);
} while (c != CharacterIterator::DONE);
delete test2; u_fprintf(out, "\n"); }
void Test::TestStringiter() { const char testChars[] = "Now is the time for all good men to come " "to the aid of their country.";
UnicodeString testString(testChars,""); const UChar *testText = testString.getTerminatedBuffer();
StringCharacterIterator iter(testText, u_strlen(testText)); StringCharacterIterator* test2 = iter.clone();
if (iter != *test2 ) { u_fprintf(out, "clone() or equals() failed: Two clones tested unequal\n"); }
UnicodeString result1, result2; // getting and comparing the text within the iterators iter.getText(result1); test2->getText(result2); if (result1 != result2) { u_fprintf(out, "getText() failed\n"); }
u_fprintf(out, "Backwards: ");
UChar c = iter.last(); int32_t i = iter.endIndex();
printUChar(c); i--; // already printed out the last char
if (iter.startIndex() != 0 || iter.endIndex() != u_strlen(testText)) { u_fprintf(out, "startIndex() or endIndex() failed\n"); }
// Testing backward iteration over a range... do { if (c == CharacterIterator::DONE) { u_fprintf(out, "Iterator reached end prematurely\n"); } else if (c != testText[i]) { u_fprintf(out, "Character mismatch at position %d\n", i); } if (iter.current() != c) { u_fprintf(out, "current() isn't working right\n"); } if (iter.getIndex() != i) { u_fprintf(out, "getIndex() isn't working right [%d should be %d]\n", iter.getIndex(), i); } if (c != CharacterIterator::DONE) { c = iter.previous(); i--; }
u_fprintf(out, "|"); printUChar(c); } while (c != CharacterIterator::DONE);
u_fprintf(out, "\n"); delete test2; }
/* Creating and using text boundaries */ int main( void ) { UErrorCode status = U_ZERO_ERROR;
out = u_finit(stdout, NULL, NULL);
u_fprintf(out, "ICU Iteration Sample Program (C++)\n\n");
Test t;
u_fprintf(out, "\n"); u_fprintf(out, "Test::TestUCharIter()\n");
t.TestUChariter();
u_fprintf(out, "-----\n"); u_fprintf(out, "Test::TestStringchariter()\n");
t.TestStringiter();
u_fprintf(out, "-----\n");
return 0; }
|