summaryrefslogtreecommitdiff
path: root/ACE/ace/String_Base.h
diff options
context:
space:
mode:
Diffstat (limited to 'ACE/ace/String_Base.h')
-rw-r--r--ACE/ace/String_Base.h891
1 files changed, 891 insertions, 0 deletions
diff --git a/ACE/ace/String_Base.h b/ACE/ace/String_Base.h
new file mode 100644
index 00000000000..4baf8e4213f
--- /dev/null
+++ b/ACE/ace/String_Base.h
@@ -0,0 +1,891 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file String_Base.h
+ *
+ * $Id$
+ *
+ * @author Douglas C. Schmidt (schmidt@cs.wustl.edu)
+ * @author Nanbor Wang <nanbor@cs.wustl.edu>
+ */
+//=============================================================================
+
+#ifndef ACE_STRING_BASE_H
+#define ACE_STRING_BASE_H
+
+#include /**/ "ace/pre.h"
+
+#include "ace/Global_Macros.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "ace/String_Base_Const.h"
+#include <iterator>
+
+ACE_BEGIN_VERSIONED_NAMESPACE_DECL
+
+// Forward decl.
+template <class ACE_CHAR_T>
+class ACE_String_Base_Iterator;
+
+// Forward decl.
+template <class ACE_CHAR_T>
+class ACE_String_Base_Const_Iterator;
+
+/**
+ * @class ACE_String_Base
+ *
+ * @brief This class provides a wrapper facade for C strings.
+ *
+ * This class uses an ACE_Allocator to allocate memory. The
+ * user can make this a persistant class by providing an
+ * ACE_Allocator with a persistable memory pool. This class is
+ * optimized for efficiency, so it doesn't provide any internal
+ * locking.
+ * @note If an instance of this class is constructed from or
+ * assigned an empty string (with first element of '\0'), then it
+ * is not allocated new space. Instead, its internal
+ * representation is set equal to a global empty string.
+ * CAUTION: in cases when ACE_String_Base is constructed from a
+ * provided buffer with the release parameter set to false,
+ * ACE_String_Base is not guaranteed to be '\0' terminated.
+ *
+ * \li Do not use a "@c -1" magic number to refer to the "no position"
+ * condition. This was never the right thing to do. The "@c npos"
+ * constant should be used in such cases.
+ * \li Do not assign or pass string positions to or from signed types.
+ * Use the "@c size_type" @c typedef found in all ACE string
+ * classes. This typedef is analogous to the "@c size_type"
+ * @c typedef found in the standard C++ string class as well as
+ * many STL class templates. If you find yourself casting you're
+ * probably doing something wrong.
+ */
+template <class ACE_CHAR_T>
+class ACE_String_Base : public ACE_String_Base_Const
+{
+public:
+ using ACE_String_Base_Const::size_type;
+
+ friend class ACE_String_Base_Iterator <ACE_CHAR_T>;
+ friend class ACE_String_Base_Const_Iterator <ACE_CHAR_T>;
+
+ // ACE-style iterators
+ typedef ACE_String_Base_Iterator <ACE_CHAR_T> ITERATOR;
+ typedef ACE_String_Base_Const_Iterator <ACE_CHAR_T> CONST_ITERATOR;
+
+ // STL-style iterators
+ typedef ACE_String_Base_Iterator <ACE_CHAR_T> iterator;
+ typedef ACE_String_Base_Const_Iterator <ACE_CHAR_T> const_iterator;
+
+ /**
+ * Default constructor.
+ *
+ * @param the_allocator ACE_Allocator associated with string
+ * @return Default ACE_String_Base string.
+ */
+ ACE_String_Base (ACE_Allocator *the_allocator = 0);
+
+ /**
+ * Constructor that copies @a s into dynamically allocated memory.
+ *
+ * if release == true then a new buffer is allocated internally, and
+ * s is copied to the internal buffer.
+ * if release == false then the s buffer is used directly. If s == 0
+ * then it will _not_ be used, and instead the internal buffer
+ * is set to NULL_String_.
+ *
+ * @param s Zero terminated input string
+ * @param the_allocator ACE_Allocator associated with string
+ * @param release Allocator responsible(true)/not responsible(false) for
+ * freeing memory.
+ * @return ACE_String_Base containing const ACE_CHAR_T *s
+ */
+ ACE_String_Base (const ACE_CHAR_T *s,
+ ACE_Allocator *the_allocator = 0,
+ bool release = true);
+
+ /**
+ * Constructor that copies @a len CHARs of @a s into dynamically
+ * allocated memory (will zero terminate the result).
+ *
+ * if release == true then a new buffer is allocated internally.
+ * s is copied to the internal buffer.
+ * if release == false then the s buffer is used directly. If s == 0
+ * then it will _not_ be used, and instead the internal buffer
+ * is set to NULL_String_.
+ *
+ * @param s Non-zero terminated input string
+ * @param len Length of non-zero terminated input string
+ * @param the_allocator ACE_Allocator associated with string
+ * @param release Allocator responsible(true)/not responsible(false) for
+ * freeing memory.
+ * @return ACE_String_Base containing const ACE_CHAR_T *s
+ */
+ ACE_String_Base (const ACE_CHAR_T *s,
+ size_type len,
+ ACE_Allocator *the_allocator = 0,
+ bool release = true);
+
+ /**
+ * Copy constructor.
+ *
+ * @param s Input ACE_String_Base string to copy
+ * @return Copy of input string @a s
+ */
+ ACE_String_Base (const ACE_String_Base < ACE_CHAR_T > &s);
+
+ /**
+ * Constructor that copies @a c into dynamically allocated memory.
+ *
+ * @param c Single input character.
+ * @param the_allocator ACE_Allocator associated with string
+ * @return ACE_String_Base containing ACE_CHAR_T 'c'
+ */
+ ACE_String_Base (ACE_CHAR_T c, ACE_Allocator *the_allocator = 0);
+
+ /**
+ * Constructor that allocates a len long string.
+ *
+ * Warning : This constructor was incorrectly documented in the past.
+ * It simply calls resize(len, c).
+ * It is probably not advisable to use the second parameter. See
+ * resize() for more information.
+ *
+ * @param len Amount of space to reserve for the string.
+ * @param c The array is filled with c's
+ * @param the_allocator ACE_Allocator associated with string
+ * @return Empty ACE_String_Base with room for len CHARs
+ */
+ ACE_String_Base (size_type len,
+ ACE_CHAR_T c = 0,
+ ACE_Allocator *the_allocator = 0);
+
+ /**
+ * Deletes the memory...
+ */
+ ~ACE_String_Base (void);
+
+ /**
+ * Return the <slot'th> character in the string (doesn't perform
+ * bounds checking).
+ *
+ * @param slot Index of the desired character
+ * @return The character at index @a slot
+ */
+ const ACE_CHAR_T & operator[] (size_type slot) const;
+
+ /**
+ * Return the <slot'th> character by reference in the string
+ * (doesn't perform bounds checking).
+ *
+ * @param slot Index of the desired character
+ * @return The character at index @a slot
+ */
+ ACE_CHAR_T & operator[] (size_type slot);
+
+ /**
+ * Assignment operator (does copy memory).
+ *
+ * @param s Input null-terminated ACE_CHAR_T string to assign to this object.
+ * @return Return a copy of the this string.
+ */
+ ACE_String_Base < ACE_CHAR_T > &operator = (const ACE_CHAR_T * s);
+
+ /**
+ * Assignment operator (does copy memory).
+ *
+ * @param s Input ACE_String_Base string to assign to this object.
+ * @return Return a copy of the this string.
+ */
+ ACE_String_Base < ACE_CHAR_T > &operator = (const ACE_String_Base < ACE_CHAR_T > &s);
+
+ /**
+ * Assignment alternative method (does not copy memory).
+ *
+ * @param s Input ACE_String_Base string to assign to this object.
+ * @return Return this string.
+ */
+ ACE_String_Base < ACE_CHAR_T > &assign_nocopy (const ACE_String_Base < ACE_CHAR_T > &s);
+
+ /**
+ * Copy @a s into this @a ACE_String_Base.
+ *
+ * If release == true then a new buffer is allocated internally if the
+ * existing one is not big enough to hold s. If the existing
+ * buffer is big enough, then it will be used. This means that
+ * set(*, 1) can be illegal when the string is constructed with a
+ * const char*. (e.g. ACE_String_Base("test", 0, false)).
+ *
+ * if release == false then the s buffer is used directly, and any
+ * existing buffer is destroyed. If s == 0 then it will _not_ be
+ * used, and instead the internal buffer is set to NULL_String_.
+ *
+ * @param s Null terminated input string
+ * @param release Allocator responsible(true)/not responsible(false) for
+ * freeing memory.
+ */
+ void set (const ACE_CHAR_T * s, bool release = true);
+
+ /**
+ * Copy @a len bytes of @a s (will zero terminate the result).
+ *
+ * If release == true then a new buffer is allocated internally if the
+ * existing one is not big enough to hold s. If the existing
+ * buffer is big enough, then it will be used. This means that
+ * set(*, *, 1) is illegal when the string is constructed with a
+ * non-owned const char*. (e.g. ACE_String_Base("test", 0, 0))
+ *
+ * If release == false then the s buffer is used directly, and any
+ * existing buffer is destroyed. If s == 0 then it will _not_ be
+ * used, and instead the internal buffer is set to NULL_String_.
+ *
+ * @param s Non-zero terminated input string
+ * @param len Length of input string 's'
+ * @param release Allocator responsible(true)/not responsible(false) for
+ * freeing memory.
+ */
+ void set (const ACE_CHAR_T * s, size_type len, bool release);
+
+ /**
+ * Clear this string. Memory is _not_ freed if @a release is false.
+ *
+ * Warning: This method was incorrectly documented in the past, but
+ * the current implementation has been changed to match the documented
+ * behavior.
+ *
+ * Warning: clear(false) behaves like fast_clear() below.
+ *
+ * @param release Memory is freed if true, and not freed if false.
+ */
+ void clear (bool release = false);
+
+ /**
+ * A more specialized version of clear(): "fast clear". fast_clear()
+ * resets the string to 0 length. If the string owns the buffer
+ * (@arg release_== true):
+ * - the string buffer is not freed
+ * - the first character of the buffer is set to 0.
+ *
+ * If @arg release_ is false (this object does not own the buffer):
+ * - the buffer pointer is reset to the NULL_String_ and does not
+ * maintain a pointer to the caller-supplied buffer on return
+ * - the maximum string length is reset to 0.
+ *
+ * Warning : Calling clear(false) or fast_clear() can have unintended
+ * side-effects if the string was constructed (or set()) with an
+ * external buffer. The string will be disassociated with the buffer
+ * and the next append() or +=() will cause a new buffer to be
+ * allocated internally.
+ */
+ void fast_clear (void);
+
+ /**
+ * Return a substring given an offset and length.
+ * If length == @c npos use rest of str. Return empty substring if
+ * offset or offset/length are invalid.
+ *
+ * @param offset Index of first desired character of the substring.
+ * @param length How many characters to return starting at the offset.
+ * @return The string containing the desired substring
+ */
+ ACE_String_Base < ACE_CHAR_T > substring (size_type offset,
+ size_type length = npos) const;
+
+ /**
+ * Same as <substring>.
+ *
+ * @param offset Index of first desired character of the substring.
+ * @param length How many characters to return starting at the offset.
+ * @return The string containing the desired substring
+ */
+ ACE_String_Base < ACE_CHAR_T > substr (size_type offset,
+ size_type length = npos) const;
+
+ /**
+ * Concat operator (copies memory).
+ *
+ * @param s Input ACE_String_Base string to concatenate to this string.
+ * @return The combined string (input append to the end of the old). New
+ * string is zero terminated.
+ */
+ ACE_String_Base < ACE_CHAR_T > &operator += (const ACE_String_Base < ACE_CHAR_T > &s);
+
+ /**
+ * Concat operator (copies memory).
+ *
+ * @param s Input C string to concatenate to this string.
+ * @return The combined string (input append to the end of the old). New
+ * string is zero terminated.
+ */
+ ACE_String_Base < ACE_CHAR_T >& operator += (const ACE_CHAR_T* s);
+
+ /**
+ * Concat operator (copies memory).
+ *
+ * @param c Input ACE_CHAR_T to concatenate to this string.
+ * @return The combined string (input append to the end of the old). New
+ * string is zero terminated.
+ */
+ ACE_String_Base < ACE_CHAR_T >& operator += (const ACE_CHAR_T c);
+
+ /**
+ * Append function (copies memory).
+ *
+ * @param s Input ACE_CHAR_T array to concatenate to this string.
+ * @param slen The length of the array.
+ * @return The combined string (input append to the end of the old). New
+ * string is zero terminated.
+ */
+ ACE_String_Base < ACE_CHAR_T >& append (const ACE_CHAR_T* s, size_type slen);
+
+ /**
+ * Returns a hash value for this string.
+ *
+ * @return Hash value of string
+ */
+ u_long hash (void) const;
+
+ /**
+ * Return the length of the string.
+ *
+ * @return Length of stored string
+ */
+ size_type length (void) const;
+
+ /**
+ * Return the number of allocated CHARs in the string object.
+ * This may be greater than the current length of the string.
+ *
+ * @return Maximum number of ACE_CHAR_T units that can be stored, including
+ * any terminating nul that may be needed.
+ */
+ size_t capacity (void) const;
+
+ /**
+ * Return @c true if the length of the string is zero, else @c false.
+ */
+ bool is_empty (void) const;
+
+ /**
+ * Return @c true if the length of the string is zero, else @c
+ * false. We recommend using @c is_empty() instead since it's more
+ * consistent with the ACE container naming conventions.
+ */
+ bool empty (void) const;
+
+ /**
+ * Get a copy of the underlying representation.
+ *
+ * This method allocates memory for a copy of the string and returns
+ * a pointer to the new area. The caller is responsible for freeing
+ * the memory when finished; use delete []
+ *
+ * @return Pointer reference to the string data. Returned string is
+ * zero terminated.
+ */
+ ACE_CHAR_T *rep (void) const;
+
+ /**
+ * Get at the underlying representation directly!
+ * _Don't_ even think about casting the result to (char *) and modifying it,
+ * if it has length 0!
+ *
+ * @return Pointer reference to the stored string data. No guarantee is
+ * that the string is zero terminated.
+ *
+ */
+ const ACE_CHAR_T *fast_rep (void) const;
+
+ /**
+ * Same as STL String's c_str() and fast_rep().
+ */
+ const ACE_CHAR_T *c_str (void) const;
+
+ /**
+ * Comparison operator that will match substrings. Returns the
+ * slot of the first location that matches, else @c npos.
+ *
+ * @param s Input ACE_String_Base string
+ * @return Integer index value of the first location of string @a s or
+ * @c npos (not found).
+ */
+ size_type strstr (const ACE_String_Base<ACE_CHAR_T> &s) const;
+
+ /**
+ * Find @a str starting at pos. Returns the slot of the first
+ * location that matches (will be >= pos), else @c npos.
+ *
+ * @param str Input ACE_String_Base string to search for in stored string.
+ * @param pos Starting index position to start searching for string @a str.
+ * @return Index value of the first location of string @a str else
+ * @c npos.
+ */
+ size_type find (const ACE_String_Base<ACE_CHAR_T> &str, size_type pos = 0) const;
+
+ /**
+ * Find @a s starting at @a pos. Returns the slot of the first
+ * location that matches (will be >= pos), else @c npos.
+ *
+ * @param s non-zero input string to search for in stored string.
+ * @param pos Starting index position to start searching for string @a str.
+ * @return Index value of the first location of string @a str else
+ * @c npos.
+ */
+ size_type find (const ACE_CHAR_T *s, size_type pos = 0) const;
+
+ /**
+ * Find @a c starting at @a pos. Returns the slot of the first
+ * location that matches (will be >= pos), else @c npos.
+ *
+ * @param c Input character to search for in stored string.
+ * @param pos Starting index position to start searching for string @a str.
+ * @return Index value of the first location of string @a str else
+ * @c npos.
+ */
+ size_type find (ACE_CHAR_T c, size_type pos = 0) const;
+
+ /**
+ * Find @a c starting at @a pos (counting from the end). Returns the
+ * slot of the first location that matches, else @c npos.
+ *
+ * @param c Input character to search for in stored string.
+ * @param pos Starting index position to start searching for string @a str.
+ * @return Index value of the first location of string @a str else
+ * @c npos.
+ */
+ size_type rfind (ACE_CHAR_T c, size_type pos = npos) const;
+
+ /**
+ * Equality comparison operator (must match entire string).
+ *
+ * @param s Input ACE_String_Base string to compare against stored string.
+ * @return @c true if equal, @c false otherwise.
+ */
+ bool operator == (const ACE_String_Base<ACE_CHAR_T> &s) const;
+
+ /**
+ * Equality comparison operator (must match entire string).
+ *
+ * @param s Null terminated string to compare against stored string.
+ * @return @c true if equal, @c false otherwise.
+ */
+ bool operator == (const ACE_CHAR_T *s) const;
+
+ /**
+ * Less than comparison operator.
+ *
+ * @param s Input ACE_String_Base string to compare against stored string.
+ * @return @c true if less than, @c false otherwise.
+ */
+ bool operator < (const ACE_String_Base<ACE_CHAR_T> &s) const;
+
+ /**
+ * Greater than comparison operator.
+ *
+ * @param s Input ACE_String_Base string to compare against stored string.
+ * @return @c true if greater than, @c false otherwise.
+ */
+ bool operator > (const ACE_String_Base<ACE_CHAR_T> &s) const;
+
+ /**
+ * Inequality comparison operator.
+ *
+ * @param s String to compare against stored string.
+ * @return @c true if not equal, @c false otherwise.
+ */
+ bool operator != (const ACE_String_Base<ACE_CHAR_T> &s) const;
+
+ /**
+ * Inequality comparison operator.
+ *
+ * @param s Null terminated string to compare against stored string.
+ * @return @c true if not equal, @c false otherwise.
+ */
+ bool operator != (const ACE_CHAR_T *s) const;
+
+ /**
+ * Performs a strncmp comparison.
+ *
+ * @param s Input ACE_String_Base string to compare against stored string.
+ * @return Integer value of result (less than 0, 0, greater than 0)
+ * depending on how input string @a s is to the stored string.
+ */
+ int compare (const ACE_String_Base<ACE_CHAR_T> &s) const;
+
+ /**
+ * Dump the state of an object.
+ */
+ void dump (void) const;
+
+ /**
+ * This method is designed for high-performance. Please use with
+ * care ;-)
+ *
+ * Warning : This method was documented incorrectly in the past.
+ * The original intention was to change the length of the string to
+ * len, and to fill the whole thing with c CHARs.
+ * However, what was actually done was to set the length of the
+ * string to zero, and fill the buffer with c's. The buffer was
+ * also not null-terminated unless c happened to be zero.
+ * Rather than fix the method to work as documented, the code is
+ * left as is, but the second parameter should probably not be used.
+ *
+ * fast_resize just adjusts the buffer if needed and sets the length,
+ * it doesn't fill the buffer, so is much faster.
+ *
+ * @param len The number of CHARs to reserve
+ * @param c The ACE_CHAR_T to use when filling the string.
+ */
+ void resize (size_type len, ACE_CHAR_T c = 0);
+ void fast_resize (size_t len);
+
+ /// Swap the contents of this @c ACE_String_Base with @a str.
+ /**
+ * @note This is non-throwing operation.
+ */
+ void swap (ACE_String_Base<ACE_CHAR_T> & str);
+
+ iterator begin (void);
+ const_iterator begin (void) const;
+
+ iterator end (void);
+ const_iterator end (void) const;
+
+ /**
+ * Declare the dynamic allocation hooks.
+ */
+ ACE_ALLOC_HOOK_DECLARE;
+
+protected:
+ /**
+ * Pointer to a memory allocator.
+ */
+ ACE_Allocator *allocator_;
+
+ /**
+ * Length of the ACE_String_Base data (not counting the trailing '\0').
+ */
+ size_type len_;
+
+ /**
+ * Length of the ACE_String_Base data buffer. Keeping track of the
+ * length allows to avoid unnecessary dynamic allocations.
+ */
+ size_type buf_len_;
+
+ /**
+ * Pointer to data.
+ */
+ ACE_CHAR_T *rep_;
+
+ /**
+ * Flag that indicates if we own the memory
+ */
+ bool release_;
+
+ /**
+ * Represents the "NULL" string to simplify the internal logic.
+ */
+ static ACE_CHAR_T NULL_String_;
+};
+
+/**
+ * @class ACE_String_Base_Iterator
+ *
+ * @brief Iterator class for the ACE_String_Base class.
+ *
+ * This class is an implementation of an iterator that allows client
+ * applications it iterator over the contents of a string. Currently,
+ * now this iterator fall under the std::bidirectional_iterator_tag
+ * category. Future versions of the class will support the operations
+ * of std::random_access_iterator_tag.
+ */
+template <class ACE_CHAR_T>
+class ACE_String_Base_Iterator
+{
+public:
+ // = std::iterator_traits typedefs/traits.
+ typedef std::bidirectional_iterator_tag iterator_category;
+ typedef ACE_CHAR_T value_type;
+ typedef ACE_CHAR_T & reference;
+ typedef ACE_CHAR_T * pointer;
+ typedef ptrdiff_t difference_type;
+
+ /**
+ * Initializing constructor
+ *
+ * @param[in] str Target string for iterator.
+ */
+ ACE_String_Base_Iterator (ACE_String_Base <ACE_CHAR_T> & str, int end = 0);
+
+ /**
+ * Copy constructor
+ *
+ * @param[in] iter Iterator to copy.
+ */
+ ACE_String_Base_Iterator (const ACE_String_Base_Iterator <ACE_CHAR_T> & iter);
+
+ /// Destructor.
+ ~ACE_String_Base_Iterator (void);
+
+ /**
+ * Test if the iterator has seen all characters.
+ *
+ * @retval 0 Characters still remain.
+ * @retval 1 All characters have been seen.
+ */
+ int done (void) const;
+
+ /**
+ * Get the current character.
+ *
+ * @param[out] ch The current character.
+ * @retval 0 All characters have been seen.
+ * @retval 1 Items still remain to be seen.
+ */
+ int next (ACE_CHAR_T * & ch) const;
+
+ /**
+ * Move to the next character in the string.
+ *
+ * @retval 0 All characters have been seen.
+ * @retval 1 Items still remain to be seen.
+ */
+ int advance (void);
+
+ /**
+ * Assignment operator
+ *
+ * @param[in] iter Right-hand side of operator.
+ * @return Reference to self.
+ */
+ const ACE_String_Base_Iterator <ACE_CHAR_T> & operator = (const ACE_String_Base_Iterator <ACE_CHAR_T> & iter);
+
+ /**
+ * Dereference operator
+ *
+ * @return Reference to current character seen by iterator.
+ */
+ ACE_CHAR_T & operator * (void);
+
+ /**
+ * Prefix operator
+ */
+ ACE_String_Base_Iterator <ACE_CHAR_T> & operator ++ (void);
+
+ /**
+ * Postfix operator
+ */
+ ACE_String_Base_Iterator <ACE_CHAR_T> operator ++ (int);
+
+ /**
+ * Prefix operator
+ */
+ ACE_String_Base_Iterator <ACE_CHAR_T> & operator -- (void);
+
+ /**
+ * Postfix operator
+ */
+ ACE_String_Base_Iterator <ACE_CHAR_T> operator -- (int);
+
+ /**
+ * Eqaulity comparison operator
+ *
+ * @param[in] rhs Right-hand side of operator.
+ */
+ bool operator == (const ACE_String_Base_Iterator <ACE_CHAR_T> & rhs) const;
+
+ /**
+ * Ineqaulity comparison operator
+ *
+ * @param[in] rhs Right-hand side of operator.
+ */
+ bool operator != (const ACE_String_Base_Iterator <ACE_CHAR_T> & rhs) const;
+
+ bool operator < (const ACE_String_Base_Iterator <ACE_CHAR_T> & rhs) const;
+ bool operator > (const ACE_String_Base_Iterator <ACE_CHAR_T> & rhs) const;
+
+ bool operator <= (const ACE_String_Base_Iterator <ACE_CHAR_T> & rhs) const;
+ bool operator >= (const ACE_String_Base_Iterator <ACE_CHAR_T> & rhs) const;
+
+private:
+ /// Target string to iterate over.
+ ACE_String_Base <ACE_CHAR_T> * str_;
+
+ /// Current location in the string.
+ size_t index_;
+};
+
+/**
+ * @class ACE_String_Base_Const_Iterator
+ *
+ * @brief Const iterator class for the ACE_String_Base class.
+ *
+ * This class is an implementation of an iterator that allows client
+ * applications it iterator over the contents of a string. Currently,
+ * now this iterator fall under the std::bidirectional_iterator_tag
+ * category. Future versions of the class will support the operations
+ * of std::random_access_iterator_tag.
+ */
+template <class ACE_CHAR_T>
+class ACE_String_Base_Const_Iterator
+{
+public:
+ // = std::iterator_traits typedefs/traits.
+ typedef std::bidirectional_iterator_tag iterator_category;
+ typedef const ACE_CHAR_T value_type;
+ typedef const ACE_CHAR_T & reference;
+ typedef const ACE_CHAR_T * pointer;
+ typedef ptrdiff_t difference_type;
+
+ /**
+ * Initializing constructor
+ *
+ * @param[in] str Target string for iterator.
+ */
+ ACE_String_Base_Const_Iterator (const ACE_String_Base <ACE_CHAR_T> & str, int end = 0);
+
+ /**
+ * Copy constructor
+ *
+ * @param[in] iter Iterator to copy.
+ */
+ ACE_String_Base_Const_Iterator (const ACE_String_Base_Const_Iterator <ACE_CHAR_T> & iter);
+
+ /// Destructor.
+ ~ACE_String_Base_Const_Iterator (void);
+
+ /**
+ * Test if the iterator has seen all characters.
+ *
+ * @retval 0 Characters still remain.
+ * @retval 1 All characters have been seen.
+ */
+ int done (void) const;
+
+ /**
+ * Get the current character.
+ *
+ * @param[out] ch The current character.
+ * @retval 0 All characters have been seen.
+ * @retval 1 Items still remain to be seen.
+ */
+ int next (const ACE_CHAR_T * & ch) const;
+
+ /**
+ * Move to the next character in the string.
+ *
+ * @retval 0 All characters have been seen.
+ * @retval 1 Items still remain to be seen.
+ */
+ int advance (void);
+
+ /**
+ * Assignment operator
+ *
+ * @param[in] iter Right-hand side of operator.
+ * @return Reference to self.
+ */
+ const ACE_String_Base_Const_Iterator <ACE_CHAR_T> & operator = (const ACE_String_Base_Const_Iterator <ACE_CHAR_T> & iter);
+
+ /**
+ * Dereference operator
+ *
+ * @return Reference to current character seen by iterator.
+ */
+ const ACE_CHAR_T & operator * (void);
+
+ /**
+ * Prefix operator
+ */
+ ACE_String_Base_Const_Iterator <ACE_CHAR_T> & operator ++ (void);
+
+ /**
+ * Postfix operator
+ */
+ ACE_String_Base_Const_Iterator <ACE_CHAR_T> operator ++ (int);
+
+ /**
+ * Prefix operator
+ */
+ ACE_String_Base_Const_Iterator <ACE_CHAR_T> & operator -- (void);
+
+ /**
+ * Postfix operator
+ */
+ ACE_String_Base_Const_Iterator <ACE_CHAR_T> operator -- (int);
+
+ /**
+ * Eqaulity comparison operator
+ *
+ * @param[in] rhs Right-hand side of operator.
+ */
+ bool operator == (const ACE_String_Base_Const_Iterator <ACE_CHAR_T> & rhs) const;
+
+ /**
+ * Ineqaulity comparison operator
+ *
+ * @param[in] rhs Right-hand side of operator.
+ */
+ bool operator != (const ACE_String_Base_Const_Iterator <ACE_CHAR_T> & rhs) const;
+
+ bool operator < (const ACE_String_Base_Const_Iterator <ACE_CHAR_T> & rhs) const;
+ bool operator > (const ACE_String_Base_Const_Iterator <ACE_CHAR_T> & rhs) const;
+
+ bool operator <= (const ACE_String_Base_Const_Iterator <ACE_CHAR_T> & rhs) const;
+ bool operator >= (const ACE_String_Base_Const_Iterator <ACE_CHAR_T> & rhs) const;
+
+private:
+ /// Target string to iterate over.
+ const ACE_String_Base <ACE_CHAR_T> * str_;
+
+ /// Current location in the string.
+ size_t index_;
+};
+
+template < class ACE_CHAR_T >
+ ACE_String_Base < ACE_CHAR_T > operator + (const ACE_String_Base < ACE_CHAR_T > &,
+ const ACE_String_Base < ACE_CHAR_T > &);
+template < class ACE_CHAR_T >
+ ACE_String_Base < ACE_CHAR_T > operator + (const ACE_String_Base < ACE_CHAR_T > &,
+ const ACE_CHAR_T *);
+template < class ACE_CHAR_T >
+ ACE_String_Base < ACE_CHAR_T > operator + (const ACE_CHAR_T *,
+ const ACE_String_Base < ACE_CHAR_T > &);
+
+template < class ACE_CHAR_T >
+ ACE_String_Base < ACE_CHAR_T > operator + (const ACE_String_Base < ACE_CHAR_T > &t,
+ const ACE_CHAR_T c);
+
+template < class ACE_CHAR_T >
+ ACE_String_Base < ACE_CHAR_T > operator + (const ACE_CHAR_T c,
+ const ACE_String_Base < ACE_CHAR_T > &t);
+
+template <class ACE_CHAR_T>
+ bool operator == (const ACE_CHAR_T *s,
+ const ACE_String_Base<ACE_CHAR_T> &t);
+
+template <class ACE_CHAR_T>
+ bool operator != (const ACE_CHAR_T *s,
+ const ACE_String_Base<ACE_CHAR_T> &t);
+
+ACE_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "ace/String_Base.inl"
+#endif /* __ACE_INLINE__ */
+
+#if defined (ACE_TEMPLATES_REQUIRE_SOURCE)
+#include "ace/String_Base.cpp"
+#endif /* ACE_TEMPLATES_REQUIRE_SOURCE */
+
+#if defined (ACE_TEMPLATES_REQUIRE_PRAGMA)
+#pragma implementation ("String_Base.cpp")
+#endif /* ACE_TEMPLATES_REQUIRE_PRAGMA */
+
+#include /**/ "ace/post.h"
+
+#endif /* ACE_STRING_BASE_H */