Browse Source

Add StringStream

Daniele Bartolini 12 năm trước cách đây
mục cha
commit
cc462d9829

+ 2 - 1
engine/CMakeLists.txt

@@ -182,7 +182,8 @@ set (STRINGS_SRC
 
 
 set (STRINGS_HEADERS
 set (STRINGS_HEADERS
 	core/strings/Path.h
 	core/strings/Path.h
-	core/strings/String.h
+	core/strings/StringUtils.h
+	core/strings/StringStream.h
 	core/strings/Hash.h
 	core/strings/Hash.h
 )
 )
 
 

+ 1 - 0
engine/Crown.h

@@ -67,6 +67,7 @@ OTHER DEALINGS IN THE SOFTWARE.
 
 
 // Core/Strings
 // Core/Strings
 #include "StringUtils.h"
 #include "StringUtils.h"
+#include "StringStream.h"
 #include "Hash.h"
 #include "Hash.h"
 #include "Path.h"
 #include "Path.h"
 
 

+ 146 - 0
engine/core/strings/StringStream.h

@@ -0,0 +1,146 @@
+/*
+Copyright (c) 2013 Daniele Bartolini, Michele Rossi
+Copyright (c) 2012 Daniele Bartolini, Simone Boscaratto
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#pragma once
+
+#include <stdio.h>
+#include "List.h"
+#include "StringUtils.h"
+
+namespace crown
+{
+
+class StringStream
+{
+public:
+
+						StringStream(Allocator& allocator);
+
+	StringStream&		operator<<(int16_t val);
+	StringStream&		operator<<(uint16_t val);
+	StringStream&		operator<<(int32_t val);
+	StringStream&		operator<<(uint32_t val);
+	StringStream&		operator<<(int64_t val);
+	StringStream&		operator<<(uint64_t val);
+	StringStream&		operator<<(float val);
+	StringStream&		operator<<(double val);
+
+	StringStream&		operator<<(const char* s);
+
+	const char*			c_str();
+
+private:
+
+	template <typename T>
+	StringStream&		stream_printf(const char* format, T& val);
+
+private:
+
+	List<char>			m_string;
+};
+
+//-----------------------------------------------------------------------------
+inline StringStream::StringStream(Allocator& allocator)
+	: m_string(allocator)
+{
+}
+
+//-----------------------------------------------------------------------------
+inline StringStream& StringStream::operator<<(int16_t val)
+{
+	return stream_printf("%hd", val);
+}
+
+//-----------------------------------------------------------------------------
+inline StringStream& StringStream::operator<<(uint16_t val)
+{
+	return stream_printf("%hu", val);
+}
+
+//-----------------------------------------------------------------------------
+inline StringStream& StringStream::operator<<(int32_t val)
+{
+	return stream_printf("%d", val);
+}
+
+//-----------------------------------------------------------------------------
+inline StringStream& StringStream::operator<<(uint32_t val)
+{
+	return stream_printf("%u", val);
+}
+
+//-----------------------------------------------------------------------------
+inline StringStream& StringStream::operator<<(int64_t val)
+{
+	return stream_printf("%lld", val);
+}
+
+//-----------------------------------------------------------------------------
+inline StringStream& StringStream::operator<<(uint64_t val)
+{
+	return stream_printf("%llu", val);
+}
+
+//-----------------------------------------------------------------------------
+inline StringStream& StringStream::operator<<(float val)
+{
+	return stream_printf("%g", val);
+}
+
+//-----------------------------------------------------------------------------
+inline StringStream& StringStream::operator<<(double val)
+{
+	return stream_printf("%g", val);
+}
+
+//-----------------------------------------------------------------------------
+inline StringStream& StringStream::operator<<(const char* s)
+{
+	m_string.push(s, string::strlen(s));
+
+	return *this;
+}
+
+//-----------------------------------------------------------------------------
+inline const char* StringStream::c_str()
+{
+	m_string.push_back('\0');
+	m_string.pop_back();
+
+	return m_string.begin();
+}
+
+//-----------------------------------------------------------------------------
+template <typename T>
+inline StringStream& StringStream::stream_printf(const char* format, T& val)
+{
+	char buf[32];
+	snprintf(buf, 32, format, val);
+
+	return *this << buf;
+}
+
+} // namespace crown