24 #include <drizzled/common.h>
25 #include <drizzled/util/data_ref.h>
33 #include <drizzled/common_fwd.h>
36 #define NOT_FIXED_DEC (uint8_t)31
42 extern const String my_null_string;
44 int sortcmp(
const String *a,
const String *b,
const charset_info_st *
const cs);
45 int stringcmp(
const String *a,
const String *b);
46 String *copy_if_not_alloced(String *a,String *b,
size_t arg_length);
47 size_t well_formed_copy_nchars(
const charset_info_st *
const to_cs,
48 char *to,
size_t to_length,
49 const charset_info_st *
const from_cs,
50 const char *from,
size_t from_length,
52 const char **well_formed_error_pos,
53 const char **cannot_convert_error_pos,
54 const char **from_end_pos);
60 size_t str_length,Alloced_length;
73 static void *
operator new(
size_t size,
memory::Root *mem_root);
74 static void operator delete(
void *, size_t)
81 { str_charset= charset_arg; }
83 inline size_t length()
const {
return str_length;}
84 inline size_t alloced_length()
const {
return Alloced_length;}
85 inline char& operator [] (
size_t i)
const {
return Ptr[i]; }
86 inline void length(
size_t len) { str_length=len; }
87 inline bool empty()
const {
return str_length == 0; }
88 inline void mark_as_const() { Alloced_length= 0; }
89 inline char *ptr() {
return Ptr; }
90 inline const char *ptr()
const {
return Ptr; }
93 if (str_length == Alloced_length)
100 inline const char* begin()
const
104 inline const char* end()
const
106 return begin() + size();
108 inline const char* data()
const
112 inline size_t size()
const
116 inline const char* c_str()
118 if (Ptr && str_length < Alloced_length)
124 void append_identifier(
const char *name,
size_t length);
125 void append_identifier(
str_ref);
127 void set(
String &str,
size_t offset,
size_t arg_length)
129 assert(&str !=
this);
131 Ptr= str.ptr()+offset; str_length=arg_length; alloced=0;
132 if (str.Alloced_length)
133 Alloced_length=str.Alloced_length-offset;
136 str_charset=str.str_charset;
138 inline void set(
char *str,
size_t arg_length,
const charset_info_st *
const cs)
141 Ptr= str; str_length=Alloced_length=arg_length ; alloced=0;
145 inline void set(
const char *str,
size_t arg_length,
const charset_info_st *
const cs)
148 Ptr=
const_cast<char*
>(str);
149 str_length=arg_length; Alloced_length=0 ; alloced=0;
152 void set_ascii(
const char *str,
size_t arg_length);
154 inline void set_quick(
char *str,
size_t arg_length,
const charset_info_st *
const cs)
158 Ptr= str; str_length= Alloced_length= arg_length;
163 void set_int(int64_t num,
bool unsigned_flag,
const charset_info_st *
const cs);
165 { set_int(num,
false, cs); }
167 { set_int(static_cast<int64_t>(num),
true, cs); }
194 Ptr[str_length--]=
'\0';
208 inline void alloc(
size_t arg_length)
210 if (arg_length >= Alloced_length)
211 real_alloc(arg_length);
213 void real_alloc(
size_t arg_length);
214 void realloc(
size_t arg_length);
215 inline void shrink(
size_t arg_length)
217 if (arg_length < Alloced_length)
220 if (!(new_ptr= reinterpret_cast<char*>(::realloc(Ptr,arg_length))))
223 real_alloc(arg_length);
228 Alloced_length=arg_length;
232 bool is_alloced() {
return alloced; }
const
241 assert(!s.uses_buffer_owned_by(
this));
243 Ptr=s.Ptr ; str_length=s.str_length ; Alloced_length=s.Alloced_length;
254 void set_or_copy_aligned(
const char *s,
size_t arg_length,
const charset_info_st*);
255 void copy(
const char*s,
size_t arg_length,
const charset_info_st& csto);
256 void append(
const char*,
size_t);
258 void append_with_prefill(
const char *s,
size_t arg_length,
size_t full_length,
char fill_char);
259 int strstr(
const String &search,
size_t offset=0);
260 int strrstr(
const String &search,
size_t offset=0);
261 void replace(
size_t offset,
size_t arg_length,
const char *to,
size_t length);
262 void replace(
size_t offset,
size_t arg_length,
const String &to);
264 inline void append(
char chr)
266 if (str_length < Alloced_length)
268 Ptr[str_length++]=chr;
272 realloc(str_length+1);
273 Ptr[str_length++]=chr;
279 size_t numchars()
const;
280 int charpos(
int i,
size_t offset= 0)
const;
282 void reserve(
size_t space_needed)
284 realloc(str_length + space_needed);
286 void reserve(
size_t space_needed,
size_t grow_by);
288 inline void append(
const char *s,
size_t arg_length,
size_t step_alloc)
290 size_t new_length= arg_length + str_length;
291 if (new_length > Alloced_length)
292 realloc(new_length + step_alloc);
293 memcpy(Ptr+str_length, s, arg_length);
294 str_length+= arg_length;
297 void print(
String&)
const;
302 inline bool uses_buffer_owned_by(
const String *s)
const
304 return (s->alloced && Ptr >= s->Ptr && Ptr < s->Ptr + s->str_length);
308 bool check_if_only_end_space(
const charset_info_st*
const,
char *str,
char *end);
310 std::ostream& operator<<(std::ostream&,
const String&);