summaryrefslogtreecommitdiff
path: root/ace/String_Base.h
blob: e85a1e73ee413730941cb66bcd95432eb6e7a1a8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
/* -*- C++ -*- */

//=============================================================================
/**
 *  @file    String_Base.h
 *
 *  $Id$
 *
 *  @author Douglas C. Schmidt (schmidt@cs.wustl.edu)
 */
//=============================================================================

#ifndef ACE_STRING_BASE_H
#define ACE_STRING_BASE_H
#include "ace/pre.h"

#include "ace/ACE.h"

#if !defined (ACE_LACKS_PRAGMA_ONCE)
# pragma once
#endif /* ACE_LACKS_PRAGMA_ONCE */

// Forward decl.
class ACE_Allocator;

/**
 * @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 0,
 * ACE_String_Base is not guaranteed to be '\0' terminated.
 */
template <class CHAR>
class ACE_Export ACE_String_Base
{
public:
  /// No position constant
  static const int npos;

  /// Default constructor.
  ACE_String_Base (ACE_Allocator *alloc = 0);

  /**
   * Constructor that copies @a s into dynamically allocated memory.
   * If @a release is non-0 then the @a ACE_allocator is responsible for
   * freeing this memory. Memory is _not_ allocated/freed if @a release
   * is 0.
   */
  ACE_String_Base (const CHAR *s,
                   ACE_Allocator *alloc = 0,
                   int release = 1);

  /**
   * Constructor that copies <len> CHARs of <s> into dynamically
   * allocated memory (will NUL terminate the result).  If <release>
   * is non-0 then the <ACE_allocator> is responsible for freeing this
   * memory.  Memory is _not_ allocated/freed if <release> is 0.
   */
  ACE_String_Base (const CHAR *s,
                   size_t len,
                   ACE_Allocator *alloc = 0,
                   int release = 1);

  /// Copy constructor.
  ACE_String_Base (const ACE_String_Base<CHAR> &);

  /// Constructor that copies @a c into dynamically allocated memory.
  ACE_String_Base (CHAR c, ACE_Allocator *alloc = 0);

  /// Constructor that dynamically allocate @a len long of char array
  /// and initialize it to @a c using @a alloc to allocate the memory.
  ACE_String_Base (size_t len, CHAR c = 0, ACE_Allocator *alloc = 0);

  /// Deletes the memory...
  ~ACE_String_Base (void);

  /// Return the <slot'th> character in the string (doesn't perform
  /// bounds checking).
  const CHAR &operator [] (size_t slot) const;

  /// Return the <slot'th> character by reference in the string
  /// (doesn't perform bounds checking).
  CHAR &operator [] (size_t slot);

  /// Assignment operator (does copy memory).
  ACE_String_Base &operator = (const ACE_String_Base<CHAR> &);

  /// Copy @a s into this @a ACE_String_Base.  Memory is _not_
  /// allocated/freed if @a release is 0.
  void set (const CHAR *s, int release = 1);

  /// Copy @a len bytes of @a s (will NUL terminate the result).
  /// Memory is _not_ allocated/freed if @a release is 0.
  void set (const CHAR *s,
            size_t len,
            int release);

  /**
   * Return a substring given an offset and length, if length == -1
   * use rest of str.  Return empty substring if offset or
   * offset/length are invalid.
   */
  ACE_String_Base<CHAR> substring (size_t offset, ssize_t length = -1) const;

  /// Same as <substring>.
  ACE_String_Base<CHAR> substr (size_t offset, ssize_t length = -1) const;

  /// Concat operator (copies memory).
  ACE_String_Base<CHAR> &operator += (const ACE_String_Base<CHAR> &);

  /// Returns a hash value for this string.
  u_long hash (void) const;

  /// Return the length of the string.
  size_t length (void) const;

  /// Get a copy of the underlying pointer.
  CHAR *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!
   */
  const CHAR *fast_rep (void) const;

  /// Same as STL String's <c_str> and <fast_rep>.
  const CHAR *c_str (void) const;

  /// Comparison operator that will match substrings.  Returns the
  /// slot of the first location that matches, else -1.
  int strstr (const ACE_String_Base<CHAR> &s) const;

  /// Find <str> starting at pos.  Returns the slot of the first
  /// location that matches (will be >= pos), else npos.
  int find (const ACE_String_Base<CHAR> &str, int pos = 0) const;

  /// Find <s> starting at pos.  Returns the slot of the first
  /// location that matches (will be >= pos), else npos.
  int find (const CHAR *s, int pos = 0) const;

  /// Find <c> starting at pos.  Returns the slot of the first
  /// location that matches (will be >= pos), else npos.
  int find (CHAR c, int pos = 0) const;

  /// Find <c> starting at pos (counting from the end).  Returns the
  /// slot of the first location that matches, else npos.
  int rfind (CHAR c, int pos = npos) const;

  /// Equality comparison operator (must match entire string).
  int operator == (const ACE_String_Base<CHAR> &s) const;

  /// Less than comparison operator.
  int operator < (const ACE_String_Base<CHAR> &s) const;

  /// Greater than comparison operator.
  int operator > (const ACE_String_Base<CHAR> &s) const;

  /// Inequality comparison operator.
  int operator != (const ACE_String_Base<CHAR> &s) const;

  /// Performs a <strcmp>-style comparison.
  int compare (const ACE_String_Base<CHAR> &s) const;

  /// Dump the state of an object.
  void dump (void) const;

  /**
   * This method is designed for high-performance. Please use with
   * care ;-) If the current size of the string is less than <len>,
   * the string is resized to the new length. The data is zero'd
   * out after this operation.
   */
  void resize (size_t len, CHAR c = 0);

  /// 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_t len_;

  /// Length of the ACE_String_Base data buffer.  Keeping track of the
  /// length allows to avoid unnecessary dynamic allocations.
  size_t buf_len_;

  /// Pointer to data.
  CHAR *rep_;

  /// Flag that indicates if we own the memory
  int release_;

  /// Represents the "NULL" string to simplify the internal logic.
  static CHAR NULL_String_;
};

template <class CHAR> ACE_INLINE
ACE_String_Base<CHAR> operator + (const ACE_String_Base<CHAR> &,
                                  const ACE_String_Base<CHAR> &);
template <class CHAR> ACE_INLINE
ACE_String_Base<CHAR> operator + (const ACE_String_Base<CHAR> &,
                                  const CHAR *);
template <class CHAR> ACE_INLINE
ACE_String_Base<CHAR> operator + (const CHAR* ,
                                  const ACE_String_Base<CHAR> &);
#if defined (__ACE_INLINE__)
#include "ace/String_Base.i"
#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 */