code: public boolean next() {
          if (nextElement <= endElement) {
              codepoint = codepointEnd = nextElement++;
              return true;
          }
          if (range < endRange) {
              loadRange(++range);
              codepoint = codepointEnd = nextElement++;
              return true;
          }
          
          // stringIterator == null iff there are no string elements remaining
          
          if (stringIterator == null) {
              return false;
          }
          codepoint = IS_STRING; // signal that value is actually a string
          string = stringIterator.next();
          if (!stringIterator.hasNext()) {
              stringIterator = null;
          }
          return true;
      }
docs: Returns the next element in the set, either a single code point
  or a string.  If there are no more elements in the set, return
  false.  If <tt>codepoint == IS_STRING</tt>, the value is a
  string in the <tt>string</tt> field.  Otherwise the value is a
  single code point in the <tt>codepoint</tt> field.
  
  <p>The order of iteration is all code points in sorted order,
  followed by all strings sorted order.  <tt>codepointEnd</tt> is
  undefined after calling this method.  <tt>string</tt> is
  undefined unless <tt>codepoint == IS_STRING</tt>.  Do not mix
  calls to <tt>next()</tt> and <tt>nextRange()</tt> without
  calling <tt>reset()</tt> between them.  The results of doing so
  are undefined.
  <p><b>Warning: </b>For speed, UnicodeSet iteration does not check for concurrent modification.
  Do not alter the UnicodeSet while iterating.
  @return true if there was another element in the set and this
  object contains the element.