Home | History | Annotate | Download | only in unicode
      1 /*
      2 * Copyright (C) 1997-2005, International Business Machines Corporation and others. All Rights Reserved.
      3 *******************************************************************************
      4 *
      5 * File PARSEPOS.H
      6 *
      7 * Modification History:
      8 *
      9 *   Date        Name        Description
     10 *   07/09/97    helena      Converted from java.
     11 *   07/17/98    stephen     Added errorIndex support.
     12 *   05/11/99    stephen     Cleaned up.
     13 *******************************************************************************
     14 */
     15 
     16 #ifndef PARSEPOS_H
     17 #define PARSEPOS_H
     18 
     19 #include "unicode/utypes.h"
     20 #include "unicode/uobject.h"
     21 
     22 
     23 U_NAMESPACE_BEGIN
     24 
     25 /**
     26  * \file
     27  * \brief C++ API: Canonical Iterator
     28  */
     29 /**
     30  * <code>ParsePosition</code> is a simple class used by <code>Format</code>
     31  * and its subclasses to keep track of the current position during parsing.
     32  * The <code>parseObject</code> method in the various <code>Format</code>
     33  * classes requires a <code>ParsePosition</code> object as an argument.
     34  *
     35  * <p>
     36  * By design, as you parse through a string with different formats,
     37  * you can use the same <code>ParsePosition</code>, since the index parameter
     38  * records the current position.
     39  *
     40  * The ParsePosition class is not suitable for subclassing.
     41  *
     42  * @version     1.3 10/30/97
     43  * @author      Mark Davis, Helena Shih
     44  * @see         java.text.Format
     45  */
     46 
     47 class U_COMMON_API ParsePosition : public UObject {
     48 public:
     49     /**
     50      * Default constructor, the index starts with 0 as default.
     51      * @stable ICU 2.0
     52      */
     53     ParsePosition()
     54         : UObject(),
     55         index(0),
     56         errorIndex(-1)
     57       {}
     58 
     59     /**
     60      * Create a new ParsePosition with the given initial index.
     61      * @param newIndex the new text offset.
     62      * @stable ICU 2.0
     63      */
     64     ParsePosition(int32_t newIndex)
     65         : UObject(),
     66         index(newIndex),
     67         errorIndex(-1)
     68       {}
     69 
     70     /**
     71      * Copy constructor
     72      * @param copy the object to be copied from.
     73      * @stable ICU 2.0
     74      */
     75     ParsePosition(const ParsePosition& copy)
     76         : UObject(copy),
     77         index(copy.index),
     78         errorIndex(copy.errorIndex)
     79       {}
     80 
     81     /**
     82      * Destructor
     83      * @stable ICU 2.0
     84      */
     85     virtual ~ParsePosition();
     86 
     87     /**
     88      * Assignment operator
     89      * @stable ICU 2.0
     90      */
     91     ParsePosition&      operator=(const ParsePosition& copy);
     92 
     93     /**
     94      * Equality operator.
     95      * @return TRUE if the two parse positions are equal, FALSE otherwise.
     96      * @stable ICU 2.0
     97      */
     98     UBool              operator==(const ParsePosition& that) const;
     99 
    100     /**
    101      * Equality operator.
    102      * @return TRUE if the two parse positions are not equal, FALSE otherwise.
    103      * @stable ICU 2.0
    104      */
    105     UBool              operator!=(const ParsePosition& that) const;
    106 
    107     /**
    108      * Clone this object.
    109      * Clones can be used concurrently in multiple threads.
    110      * If an error occurs, then NULL is returned.
    111      * The caller must delete the clone.
    112      *
    113      * @return a clone of this object
    114      *
    115      * @see getDynamicClassID
    116      * @stable ICU 2.8
    117      */
    118     ParsePosition *clone() const;
    119 
    120     /**
    121      * Retrieve the current parse position.  On input to a parse method, this
    122      * is the index of the character at which parsing will begin; on output, it
    123      * is the index of the character following the last character parsed.
    124      * @return the current index.
    125      * @stable ICU 2.0
    126      */
    127     int32_t getIndex(void) const;
    128 
    129     /**
    130      * Set the current parse position.
    131      * @param index the new index.
    132      * @stable ICU 2.0
    133      */
    134     void setIndex(int32_t index);
    135 
    136     /**
    137      * Set the index at which a parse error occurred.  Formatters
    138      * should set this before returning an error code from their
    139      * parseObject method.  The default value is -1 if this is not
    140      * set.
    141      * @stable ICU 2.0
    142      */
    143     void setErrorIndex(int32_t ei);
    144 
    145     /**
    146      * Retrieve the index at which an error occurred, or -1 if the
    147      * error index has not been set.
    148      * @stable ICU 2.0
    149      */
    150     int32_t getErrorIndex(void) const;
    151 
    152     /**
    153      * ICU "poor man's RTTI", returns a UClassID for this class.
    154      *
    155      * @stable ICU 2.2
    156      */
    157     static UClassID U_EXPORT2 getStaticClassID();
    158 
    159     /**
    160      * ICU "poor man's RTTI", returns a UClassID for the actual class.
    161      *
    162      * @stable ICU 2.2
    163      */
    164     virtual UClassID getDynamicClassID() const;
    165 
    166 private:
    167     /**
    168      * Input: the place you start parsing.
    169      * <br>Output: position where the parse stopped.
    170      * This is designed to be used serially,
    171      * with each call setting index up for the next one.
    172      */
    173     int32_t index;
    174 
    175     /**
    176      * The index at which a parse error occurred.
    177      */
    178     int32_t errorIndex;
    179 
    180 };
    181 
    182 inline ParsePosition&
    183 ParsePosition::operator=(const ParsePosition& copy)
    184 {
    185   index = copy.index;
    186   errorIndex = copy.errorIndex;
    187   return *this;
    188 }
    189 
    190 inline UBool
    191 ParsePosition::operator==(const ParsePosition& copy) const
    192 {
    193   if(index != copy.index || errorIndex != copy.errorIndex)
    194   return FALSE;
    195   else
    196   return TRUE;
    197 }
    198 
    199 inline UBool
    200 ParsePosition::operator!=(const ParsePosition& copy) const
    201 {
    202   return !operator==(copy);
    203 }
    204 
    205 inline int32_t
    206 ParsePosition::getIndex() const
    207 {
    208   return index;
    209 }
    210 
    211 inline void
    212 ParsePosition::setIndex(int32_t offset)
    213 {
    214   this->index = offset;
    215 }
    216 
    217 inline int32_t
    218 ParsePosition::getErrorIndex() const
    219 {
    220   return errorIndex;
    221 }
    222 
    223 inline void
    224 ParsePosition::setErrorIndex(int32_t ei)
    225 {
    226   this->errorIndex = ei;
    227 }
    228 U_NAMESPACE_END
    229 
    230 #endif
    231