p2p/stingray_sdk/plugin_foundation/string_stream.inl
Lucas Schwiderski 2c9ce46dd2
chore: Rework project structure
There likely won't be much need for multiple separate crates.
2023-05-26 23:42:01 +02:00

116 lines
2 KiB
C++

#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include "encoding.h"
namespace stingray_plugin_foundation {
inline StringStream::StringStream(Allocator &a) : _buffer(a) {}
inline StringStream & StringStream::operator<<(char c)
{
_buffer.push_back(c);
return *this;
}
inline StringStream &StringStream::operator<<(const char *s)
{
int end = _buffer.size();
int n = (int)strlen(s);
_buffer.resize(end + n);
if (n > 0)
memmove(&_buffer[end], s, n);
return *this;
}
inline StringStream &StringStream::operator<<(char *s)
{
int end = _buffer.size();
int n = (int)strlen(s);
_buffer.resize(end + n);
if (n > 0)
memmove(&_buffer[end], s, n);
return *this;
}
inline StringStream &StringStream::operator<<(const wchar_t *s)
{
while (*s) {
char utf8[6];
*encoding::utf8_encode(*s, utf8) = 0;
(*this) << utf8;
++s;
}
return *this;
}
inline StringStream &StringStream::operator<<(wchar_t *s)
{
while (*s) {
char utf8[6];
*encoding::utf8_encode(*s, utf8) = 0;
(*this) << utf8;
++s;
}
return *this;
}
inline StringStream &StringStream::operator<<(double d)
{
char buffer[64];
sprintf(buffer, "%.17g", d);
(*this) << buffer;
return *this;
}
inline StringStream &StringStream::operator<<(float f)
{
char buffer[20];
sprintf(buffer, "%.9g", f);
(*this) << buffer;
return *this;
}
inline StringStream &StringStream::operator<<(int i)
{
char buffer[20];
sprintf(buffer, "%i", i);
(*this) << buffer;
return *this;
}
inline StringStream &StringStream::operator<<(unsigned u)
{
char buffer[20];
sprintf(buffer, "%u", u);
(*this) << buffer;
return *this;
}
inline StringStream &StringStream::operator<<(uint64_t u)
{
char buffer[20];
sprintf(buffer, "%016" "llx", u);
(*this) << buffer;
return *this;
}
inline void StringStream::set_capacity(unsigned s)
{
_buffer.set_capacity(s);
}
inline const char *StringStream::c_str() const
{
_buffer.push_back(0);
_buffer.pop_back();
return _buffer.begin();
}
inline unsigned StringStream::size() const
{
return _buffer.size();
}
} // namespace stingray_plugin_foundation