00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00015 #include "stringbuf.hpp"
00016 #include <stdio.h>
00017
00018 using namespace std;
00019
00020
00021 #define PLUS_BODY(form) \
00022 char buf[25]; \
00023 sprintf(buf, "%" form, val); \
00024 tmps.add(buf); \
00025 ptrs.add(&tmps.tail->val); \
00026 return *this;
00027
00028 StringBuf& StringBuf::operator+(int val)
00029 {
00030 PLUS_BODY("d")
00031 }
00032
00033 StringBuf& StringBuf::operator+(unsigned int val)
00034 {
00035 PLUS_BODY("u")
00036 }
00037
00038 StringBuf& StringBuf::operator+(long val)
00039 {
00040 PLUS_BODY("ld")
00041 }
00042
00043 StringBuf& StringBuf::operator+(unsigned long val)
00044 {
00045 PLUS_BODY("lu")
00046 }
00047
00048 #undef PLUS_BODY
00049
00050 StringBuf::operator std::string() const
00051 {
00052 typedef StringBuf_private::Node<const string*> node_type;
00053
00054 int len=0;
00055 for (node_type* ptr=ptrs.head; ptr; ptr=ptr->next) len+=ptr->val->size();
00056
00057 string ret;
00058 ret.reserve(len);
00059
00060 for (node_type* ptr=ptrs.head; ptr; ptr=ptr->next) ret.append(*ptr->val);
00061 return ret;
00062 }