25 #ifndef __AMPS_FIELD_HPP__ 26 #define __AMPS_FIELD_HPP__ 28 #define _AMPS_SKIP_AMPSPLUSPLUS 30 #undef _AMPS_SKIP_AMPSPLUSPLUS 35 #define AMPS_UNSET_INDEX (size_t)-1 36 #define AMPS_TIMESTAMP_LEN 16 37 #define AMPS_TIMESTAMP_LEN_LONG 23 38 #define AMPS_MAX_BOOKMARK_LEN 42 40 #define AMPS_MAX_SUBID_LEN 1048576 // 1MB, NOT FIXED IN AMPS 42 #if (_MSC_VER >= 1400) // VS2005 or higher 43 #define AMPS_snprintf(buf_, sz_, ...) _snprintf_s(buf_, sz_, _TRUNCATE, __VA_ARGS__) 44 #define AMPS_snprintf_amps_uint64_t(buf,sz,val) sprintf_s(buf,sz,"%I64u",val) 46 #define AMPS_snprintf_sizet(buf,sz,val) sprintf_s(buf,sz,"%lu",val) 48 #define AMPS_snprintf_sizet(buf,sz,val) sprintf_s(buf,sz,"%u",val) 50 #else // VS2003 or older 51 #define AMPS_snprintf _snprintf 53 #define AMPS_snprintf_sizet(buf,sz,val) _sprintf(buf,sz,"%lu",val) 55 #define AMPS_snprintf_sizet(buf,sz,val) _sprintf(buf,sz,"%u",val) 59 #define AMPS_snprintf snprintf 61 #define AMPS_snprintf_amps_uint64_t(buf,sz,val) snprintf(buf,sz,"%lu", (unsigned long)val) 62 #define AMPS_snprintf_sizet(buf,sz,val) snprintf(buf,sz,"%lu",val) 64 #define AMPS_snprintf_amps_uint64_t(buf,sz,val) snprintf(buf,sz,"%llu",val) 65 #define AMPS_snprintf_sizet(buf,sz,val) snprintf(buf,sz,"%u",val) 91 Field() : _data(NULL), _len(0) {;}
92 Field(
const char* data_)
95 _len = ::strlen(data_);
97 Field(
const char* data_,
size_t len_)
113 Field(
const std::string& string_)
115 _data = string_.c_str();
116 _len = string_.length();
119 bool contains(
const char* searchString,
size_t len)
const 121 const char* dataEnd = _data + _len;
122 return std::search(_data, dataEnd, searchString, searchString + len) != dataEnd;
135 operator std::string ()
const 137 return _len ? std::string(_data, _len) : std::string();
147 if ( _len == rhs_._len )
149 return ::memcmp(_data, rhs_._data, _len) == 0;
163 return (!_data && !rhs_);
165 return ::strncmp(_data, rhs_, _len) == 0 && rhs_[_len] ==
'\0';
168 bool operator<(
const Field& rhs)
const;
177 if ( _len == rhs_._len )
179 return ::memcmp(_data, rhs_._data, _len) != 0;
191 return strncmp(_data, rhs_, _len) != 0 || rhs_[_len] !=
'\0';
201 return rhs_.compare(0, rhs_.length(), _data, _len) != 0;
211 return rhs_.compare(0, rhs_.length(), _data, _len) == 0;
222 _data =
new char[orig_._len];
223 ::memcpy(static_cast<void*>(const_cast<char*>(_data)),
224 orig_._data, orig_._len);
272 void assign(
const char* ptr,
size_t len)
279 inline size_t hash_function()
const 282 const char* p_ = _data;
286 c = (
unsigned long) * p_;
295 size_t operator()(
const Field& f)
const 297 return f.hash_function();
300 bool operator()(
const Field& f1,
const Field& f2)
const 315 return ::memcmp(f1.
data(), f2.
data(), f2.
len()) < 0;
320 static bool isTimestamp(
const Field& field_)
322 return (field_.
len() >= AMPS_TIMESTAMP_LEN
323 && field_.
len() <= AMPS_TIMESTAMP_LEN_LONG
324 && field_.
data()[8] ==
'T');
328 static void parseBookmark(
const Field& field_,
329 amps_uint64_t& publisherId_,
330 amps_uint64_t& sequenceNumber_)
332 publisherId_ = sequenceNumber_ = (amps_uint64_t)0;
334 size_t len = field_.
len();
336 if (isTimestamp(field_))
341 for ( ; i <
len; ++i)
348 publisherId_ += (amps_uint64_t)(data[i] -
'0');
350 for (i = i + 1; i <
len; ++i)
356 sequenceNumber_ *= 10;
357 sequenceNumber_ += (amps_uint64_t)(data[i] -
'0');
363 class BookmarkRange :
public Field 366 static bool isRange(
const Field& bookmark_)
368 return memchr(bookmark_.
data(),
':', bookmark_.
len()) != NULL;
372 :
Field(), _start(), _end(), _open(AMPS_UNSET_INDEX)
373 , _capacity(AMPS_UNSET_INDEX)
378 BookmarkRange(
const Field& field_)
379 :
Field(), _start(), _end(), _open(AMPS_UNSET_INDEX)
380 , _capacity(field_.
len())
385 void set(
const Field& field_)
397 bool foundSeparator =
false;
398 bool foundClose =
false;
399 for (
size_t i = 0; i < _len; ++i)
407 if (foundClose || _open != AMPS_UNSET_INDEX)
432 if (foundClose || _open == AMPS_UNSET_INDEX)
437 else if (foundSeparator)
441 _end.assign(_data + i, 0);
444 else if (!_start.data())
446 _start.assign(_data + i, 0);
453 if (foundSeparator || foundClose || _open == AMPS_UNSET_INDEX
459 foundSeparator =
true;
461 if (_start.len() == 0)
464 _start.assign(_start.data(), i - (size_t)(_start.data() - _data));
472 if (foundClose || _open == AMPS_UNSET_INDEX || !_end.data())
483 _end.assign(_end.data(), i - (size_t)(_end.data() - _data));
490 if (_end.data() && _end.len() == 0)
493 _end.assign(_end.data(), i - (size_t)(_end.data() - _data));
496 else if (_start.data() && _start.len() == 0)
499 _start.assign(_start.data(), i - (size_t)(_start.data() - _data));
511 if (_start.empty() || _end.empty())
529 _open = AMPS_UNSET_INDEX;
542 bool isStartInclusive()
const 544 return _data[_open] ==
'[';
549 void makeStartExclusive()
551 const_cast<char*
>(_data)[_open] =
'(';
556 bool isEndInclusive()
const 558 return _data[_len - 1] ==
']';
563 void makeEndExclusive()
565 const_cast<char*
>(_data)[_len - 1] =
')';
570 const Field& getStart()
const 575 const Field& getEnd()
const 582 void replaceStart(
const Field& start_,
bool makeExclusive_ =
false)
586 if (_capacity >= (start_.
len() + _end.len() + 3))
588 char*
data =
const_cast<char*
>(_data);
595 data[0] = _data[_open];
598 if ((
size_t)(_end.data() - _data - 2) < start_.
len())
600 size_t newLen = start_.
len() + _end.len() + 3;
604 for (
size_t dest = newLen - 1, src = _len - 1;
605 src > _start.len(); --src, --dest)
607 data[dest] = _data[src];
609 if (data[src] ==
':')
611 _end.assign(data + dest + 1, _end.len());
618 ::memcpy(static_cast<void*>(data + 1), start_.
data(), start_.
len());
619 _start.assign(data + 1, start_.
len());
621 if ((
size_t)(_end.data() - _start.data()) > _start.len() + 1UL)
624 for (
size_t dest = _start.len() + 1, src = _end.data() - data - 1;
625 src < _len; ++dest, ++src)
627 data[dest] = data[src];
628 if (data[src] ==
']' || data[src] ==
')')
630 _end.assign(data + _start.len() + 2, _end.len());
634 _len = _start.len() + _end.len() + 3;
641 _capacity = (4UL * AMPS_MAX_BOOKMARK_LEN + 6UL
642 >= start_.
len() + _end.len() + 3UL)
643 ? (4UL * AMPS_MAX_BOOKMARK_LEN + 6UL)
644 : (start_.
len() + _end.len() + 3UL);
645 char*
data =
new char[_capacity];
652 data[0] = _data[_open];
655 ::memcpy(static_cast<void*>(data + 1), start_.
data(), start_.
len());
656 _start.assign(data + 1, start_.
len());
657 data[start_.
len() + 1] =
':';
658 ::memcpy(static_cast<void*>(data + start_.
len() + 2), _end.data(),
660 _end.assign(data + start_.
len() + 2, _end.len());
661 size_t len = start_.
len() + 3 + _end.len();
662 data[len - 1] = _data[_len - 1];
bool operator==(const char *rhs_) const
String comparison operator Returns `true' if self and rhs are equivalent, `false' otherwise...
Definition: Field.hpp:159
Core type and function declarations for the AMPS C client.
bool operator!=(const std::string &rhs_) const
String comparison operator Returns `true' if self and rhs are not equivalent.
Definition: Field.hpp:199
bool operator!=(const Field &rhs_) const
Comparison operator Returns true if self and rhs are not equivalent.
Definition: Field.hpp:175
bool operator==(const Field &rhs_) const
Comparison operator Returns `true' if self and rhs are equivalent, `false' otherwise.
Definition: Field.hpp:145
void clear()
Deletes the data associated with this Field, should only be used on Fields that were created as deepC...
Definition: Field.hpp:246
const char * data() const
Returns the (non-null-terminated) data underlying this field.
Definition: Field.hpp:259
bool empty() const
Returns 'true' if empty, 'false' otherwise.
Definition: Field.hpp:127
size_t len() const
Returns the length of the data underlying this field.
Definition: Field.hpp:266
bool operator!=(const char *rhs_) const
String comparison operator Returns true if self and rhs are not equivalent.
Definition: Field.hpp:189
Field represents the value of a single field in a Message.
Definition: Field.hpp:85
void deepCopy(const Field &orig_)
Makes self a deep copy of the original field.
Definition: Field.hpp:217
Definition: ampsplusplus.hpp:103
bool operator==(const std::string &rhs_) const
String comparison operator Returns `true' if self and rhs are equivalent.
Definition: Field.hpp:209
Field deepCopy() const
Makes a deep copy of self, returns it.
Definition: Field.hpp:236