00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #ifndef __BYTESTREAM_H__
00031 #define __BYTESTREAM_H__
00032
00038 #include "unicode/utypes.h"
00039 #include "unicode/uobject.h"
00040 #include "unicode/std_string.h"
00041
00042 U_NAMESPACE_BEGIN
00043
00048 class U_COMMON_API ByteSink : public UMemory {
00049 public:
00054 ByteSink() { }
00059 virtual ~ByteSink() { }
00060
00067 virtual void Append(const char* bytes, int32_t n) = 0;
00068
00111 virtual char* GetAppendBuffer(int32_t min_capacity,
00112 int32_t desired_capacity_hint,
00113 char* scratch, int32_t scratch_capacity,
00114 int32_t* result_capacity);
00115
00123 virtual void Flush();
00124
00125 private:
00126 ByteSink(const ByteSink &);
00127 ByteSink &operator=(const ByteSink &);
00128 };
00129
00130
00131
00132
00142 class U_COMMON_API CheckedArrayByteSink : public ByteSink {
00143 public:
00150 CheckedArrayByteSink(char* outbuf, int32_t capacity);
00157 virtual void Append(const char* bytes, int32_t n);
00172 virtual char* GetAppendBuffer(int32_t min_capacity,
00173 int32_t desired_capacity_hint,
00174 char* scratch, int32_t scratch_capacity,
00175 int32_t* result_capacity);
00181 int32_t NumberOfBytesWritten() const { return size_; }
00188 UBool Overflowed() const { return overflowed_; }
00189 private:
00190 char* outbuf_;
00191 const int32_t capacity_;
00192 int32_t size_;
00193 bool overflowed_;
00194 CheckedArrayByteSink();
00195 CheckedArrayByteSink(const CheckedArrayByteSink &);
00196 CheckedArrayByteSink &operator=(const CheckedArrayByteSink &);
00197 };
00198
00199 #if U_HAVE_STD_STRING
00200
00206 template<typename StringClass>
00207 class StringByteSink : public ByteSink {
00208 public:
00214 StringByteSink(StringClass* dest) : dest_(dest) { }
00221 virtual void Append(const char* data, int32_t n) { dest_->append(data, n); }
00222 private:
00223 StringClass* dest_;
00224 StringByteSink();
00225 StringByteSink(const StringByteSink &);
00226 StringByteSink &operator=(const StringByteSink &);
00227 };
00228
00229 #endif
00230
00231 U_NAMESPACE_END
00232
00233 #endif // __BYTESTREAM_H__