stream.cpp stream.hpp
streamlogger.cpp streamlogger.hpp streamlogger-ti.hpp
string.cpp string.hpp string-script.cpp
+ stringbuilder.cpp stringbuilder.hpp
sysloglogger.cpp sysloglogger.hpp sysloglogger-ti.hpp
tcpsocket.cpp tcpsocket.hpp
threadpool.cpp threadpool.hpp
#include "base/dictionary.hpp"
#include "base/array.hpp"
#include "base/objectlock.hpp"
+#include "base/stringbuilder.hpp"
#include <algorithm>
#include <climits>
#include <cstdint>
using namespace icinga;
-// Just for the sake of code readability
-typedef std::vector<char> StringBuilder;
-
union EndiannessDetector
{
EndiannessDetector()
UIntToByte(i & 255u)
};
- builder.insert(builder.end(), (char*)buf, (char*)buf + 8);
+ builder.Append((char*)buf, (char*)buf + 8);
}
union Double2BytesConverter
SwapBytes(converter.buf[3], converter.buf[4]);
}
- builder.insert(builder.end(), (char*)converter.buf, (char*)converter.buf + 8);
+ builder.Append((char*)converter.buf, (char*)converter.buf + 8);
}
/**
static inline void PackString(const String& string, StringBuilder& builder)
{
PackUInt64BE(string.GetLength(), builder);
- builder.insert(builder.end(), string.Begin(), string.End());
+ builder.Append(string);
}
/**
{
ObjectLock olock(arr);
- builder.emplace_back(5);
+ builder.Append('\5');
PackUInt64BE(arr->GetLength(), builder);
for (const Value& value : arr) {
{
ObjectLock olock(dict);
- builder.emplace_back(6);
+ builder.Append('\6');
PackUInt64BE(dict->GetLength(), builder);
for (const Dictionary::Pair& kv : dict) {
{
switch (value.GetType()) {
case ValueString:
- builder.emplace_back(4);
+ builder.Append('\4');
PackString(value.Get<String>(), builder);
break;
case ValueNumber:
- builder.emplace_back(3);
+ builder.Append('\3');
PackFloat64BE(value.Get<double>(), builder);
break;
case ValueBoolean:
- builder.emplace_back(value.ToBool() ? 2 : 1);
+ builder.Append(value.ToBool() ? '\2' : '\1');
break;
case ValueEmpty:
- builder.emplace_back(0);
+ builder.Append('\0');
break;
case ValueObject:
}
}
- builder.emplace_back(0);
+ builder.Append('\0');
break;
default:
StringBuilder builder;
PackAny(value, builder);
- return String(builder.begin(), builder.end());
+ return builder.ToString();
}
--- /dev/null
+/******************************************************************************
+ * Icinga 2 *
+ * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU General Public License *
+ * as published by the Free Software Foundation; either version 2 *
+ * of the License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the Free Software Foundation *
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. *
+ ******************************************************************************/
+
+#include "base/stringbuilder.hpp"
+#include <cstring>
+
+using namespace icinga;
+
+void StringBuilder::Append(const String& str)
+{
+ m_Buffer.insert(m_Buffer.end(), str.Begin(), str.End());
+}
+
+void StringBuilder::Append(const std::string& str)
+{
+ m_Buffer.insert(m_Buffer.end(), str.begin(), str.end());
+}
+
+void StringBuilder::Append(const char *begin, const char *end)
+{
+ m_Buffer.insert(m_Buffer.end(), begin, end);
+}
+
+void StringBuilder::Append(const char *cstr)
+{
+ m_Buffer.insert(m_Buffer.end(), cstr, cstr + std::strlen(cstr));
+}
+
+void StringBuilder::Append(char chr)
+{
+ m_Buffer.emplace_back(chr);
+}
+
+String StringBuilder::ToString() const
+{
+ return String(m_Buffer.data(), m_Buffer.data() + m_Buffer.size());
+}
--- /dev/null
+/******************************************************************************
+ * Icinga 2 *
+ * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU General Public License *
+ * as published by the Free Software Foundation; either version 2 *
+ * of the License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the Free Software Foundation *
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. *
+ ******************************************************************************/
+
+#ifndef STRINGBUILDER_H
+#define STRINGBUILDER_H
+
+#include "base/i2-base.hpp"
+#include "base/string.hpp"
+#include <string>
+#include <vector>
+
+namespace icinga
+{
+
+/**
+ * A string builder.
+ *
+ * @ingroup base
+ */
+class StringBuilder final
+{
+public:
+ void Append(const String&);
+ void Append(const std::string&);
+ void Append(const char *, const char *);
+ void Append(const char *);
+ void Append(char);
+
+ String ToString() const;
+
+private:
+ std::vector<char> m_Buffer;
+};
+
+}
+
+#endif /* STRINGBUILDER_H */