diff options
Diffstat (limited to 'Swiften/Base')
-rw-r--r-- | Swiften/Base/Algorithm.h | 5 | ||||
-rw-r--r-- | Swiften/Base/ByteArray.cpp | 58 | ||||
-rw-r--r-- | Swiften/Base/ByteArray.h | 151 | ||||
-rw-r--r-- | Swiften/Base/Concat.h | 73 | ||||
-rw-r--r-- | Swiften/Base/Paths.cpp | 12 | ||||
-rw-r--r-- | Swiften/Base/UnitTest/ByteArrayTest.cpp | 18 |
6 files changed, 128 insertions, 189 deletions
diff --git a/Swiften/Base/Algorithm.h b/Swiften/Base/Algorithm.h index f0c6b48..c1cd0d3 100644 --- a/Swiften/Base/Algorithm.h +++ b/Swiften/Base/Algorithm.h @@ -88,6 +88,11 @@ namespace Swift { Detail::eraseIfImpl(container, predicate, typename Detail::ContainerTraits<C>::Category()); } + template<typename C> + void append(C& target, const C& source) { + target.insert(target.end(), source.begin(), source.end()); + } + /* * Functors */ diff --git a/Swiften/Base/ByteArray.cpp b/Swiften/Base/ByteArray.cpp index 8c8b215..10da395 100644 --- a/Swiften/Base/ByteArray.cpp +++ b/Swiften/Base/ByteArray.cpp @@ -8,44 +8,26 @@ #include <fstream> -std::ostream& operator<<(std::ostream& os, const Swift::ByteArray& s) { - return operator<<(os, s.getDataVector()); -} - -std::ostream& operator<<(std::ostream& os, const std::vector<unsigned char>& s) { - std::ios::fmtflags oldFlags = os.flags(); - os << std::hex; - for (Swift::ByteArray::const_iterator i = s.begin(); i != s.end(); ++i) { - os << "0x" << static_cast<unsigned int>(static_cast<unsigned char>(*i)); - if (i + 1 < s.end()) { - os << " "; - } - } - os << std::endl; - os.flags(oldFlags); - return os; -} - namespace Swift { static const int BUFFER_SIZE = 4096; -void ByteArray::readFromFile(const std::string& file) { +void readByteArrayFromFile(ByteArray& data, const std::string& file) { std::ifstream input(file.c_str(), std::ios_base::in|std::ios_base::binary); while (input.good()) { - size_t oldSize = data_.size(); - data_.resize(oldSize + BUFFER_SIZE); - input.read(reinterpret_cast<char*>(&data_[oldSize]), BUFFER_SIZE); - data_.resize(oldSize + input.gcount()); + size_t oldSize = data.size(); + data.resize(oldSize + BUFFER_SIZE); + input.read(reinterpret_cast<char*>(&data[oldSize]), BUFFER_SIZE); + data.resize(oldSize + input.gcount()); } input.close(); } -std::vector<unsigned char> ByteArray::create(const std::string& s) { +std::vector<unsigned char> createByteArray(const std::string& s) { return std::vector<unsigned char>(s.begin(), s.end()); } -std::vector<unsigned char> ByteArray::create(const char* c) { +std::vector<unsigned char> createByteArray(const char* c) { std::vector<unsigned char> data; while (*c) { data.push_back(static_cast<unsigned char>(*c)); @@ -54,32 +36,26 @@ std::vector<unsigned char> ByteArray::create(const char* c) { return data; } -std::vector<unsigned char> ByteArray::create(const char* c, size_t n) { - std::vector<unsigned char> data; - if (n > 0) { - data.resize(n); - memcpy(&data[0], c, n); - } +std::vector<unsigned char> createByteArray(const char* c, size_t n) { + std::vector<unsigned char> data(n); + std::copy(c, c + n, data.begin()); return data; } -std::vector<unsigned char> ByteArray::create(const unsigned char* c, size_t n) { - std::vector<unsigned char> data; - if (n > 0) { - data.resize(n); - memcpy(&data[0], c, n); - } +std::vector<unsigned char> createByteArray(const unsigned char* c, size_t n) { + std::vector<unsigned char> data(n); + std::copy(c, c + n, data.begin()); return data; } -std::string ByteArray::toString() const { +std::string byteArrayToString(const ByteArray& b) { size_t i; - for (i = data_.size(); i > 0; --i) { - if (data_[i - 1] != 0) { + for (i = b.size(); i > 0; --i) { + if (b[i - 1] != 0) { break; } } - return i > 0 ? std::string(reinterpret_cast<const char*>(getData()), i) : ""; + return i > 0 ? std::string(reinterpret_cast<const char*>(vecptr(b)), i) : ""; } } diff --git a/Swiften/Base/ByteArray.h b/Swiften/Base/ByteArray.h index ebc22d8..8ef8dd6 100644 --- a/Swiften/Base/ByteArray.h +++ b/Swiften/Base/ByteArray.h @@ -8,147 +8,32 @@ #include <vector> #include <string> -#include <cstring> // for memcpy namespace Swift { - class ByteArray - { - public: - typedef std::vector<unsigned char>::const_iterator const_iterator; + typedef std::vector<unsigned char> ByteArray; - ByteArray() : data_() {} + ByteArray createByteArray(const unsigned char* c, size_t n); + ByteArray createByteArray(const std::string& s); + ByteArray createByteArray(const char* c); + ByteArray createByteArray(const char* c, size_t n); - ByteArray(const std::string& s) : data_(s.begin(), s.end()) {} + inline ByteArray createByteArray(char c) { + return std::vector<unsigned char>(1, c); + } - ByteArray(const char* c) { - while (*c) { - data_.push_back(static_cast<unsigned char>(*c)); - ++c; - } - } - ByteArray(const char* c, size_t n) { - if (n > 0) { - data_.resize(n); - memcpy(&data_[0], c, n); - } - } + template<typename T, typename A> + static const T* vecptr(const std::vector<T, A>& v) { + return v.empty() ? NULL : &v[0]; + } - ByteArray(const unsigned char* c, size_t n) { - if (n > 0) { - data_.resize(n); - memcpy(&data_[0], c, n); - } - } + template<typename T, typename A> + static T* vecptr(std::vector<T, A>& v) { + return v.empty() ? NULL : &v[0]; + } - ByteArray(const std::vector<unsigned char>& data) : data_(data) { - } + std::string byteArrayToString(const ByteArray& b); - const unsigned char* getData() const { - return data_.empty() ? NULL : &data_[0]; - } - - unsigned char* getData() { - return data_.empty() ? NULL : &data_[0]; - } - - const std::vector<unsigned char>& getVector() const { - return data_; - } - - std::vector<unsigned char>& getVector() { - return data_; - } - - size_t getSize() const { - return data_.size(); - } - - bool isEmpty() const { - return data_.empty(); - } - - void resize(size_t size) { - return data_.resize(size); - } - - void resize(size_t size, char c) { - return data_.resize(size, static_cast<unsigned char>(c)); - } - - friend ByteArray operator+(const ByteArray& a, const ByteArray&b) { - ByteArray result(a); - result.data_.insert(result.data_.end(), b.data_.begin(), b.data_.end()); - return result; - } - - friend ByteArray operator+(const ByteArray& a, char b) { - ByteArray x; - x.resize(1); - x[0] = static_cast<unsigned char>(b); - return a + x; - } - - ByteArray& operator+=(const ByteArray& b) { - data_.insert(data_.end(), b.data_.begin(), b.data_.end()); - return *this; - } - - ByteArray& operator+=(char c) { - data_.push_back(static_cast<unsigned char>(c)); - return *this; - } - - friend bool operator==(const ByteArray& a, const ByteArray& b) { - return a.data_ == b.data_; - } - - - const unsigned char& operator[](size_t i) const { - return data_[i]; - } - - unsigned char& operator[](size_t i) { - return data_[i]; - } - - const_iterator begin() const { - return data_.begin(); - } - - const_iterator end() const { - return data_.end(); - } - - std::string toString() const; - - void readFromFile(const std::string& file); - - void clear() { - data_.clear(); - } - - const std::vector<unsigned char>& getDataVector() const { - return data_; - } - - static std::vector<unsigned char> create(const std::string& s); - static std::vector<unsigned char> create(const char* c); - static std::vector<unsigned char> create(const unsigned char* c, size_t n); - static std::vector<unsigned char> create(const char* c, size_t n); - - static const unsigned char* data(const std::vector<unsigned char>& v) { - return v.empty() ? NULL : &v[0]; - } - - static const char* charData(const std::vector<unsigned char>& v) { - return v.empty() ? NULL : reinterpret_cast<const char*>(&v[0]); - } - - private: - std::vector<unsigned char> data_; - }; + void readByteArrayFromFile(ByteArray&, const std::string& file); } -std::ostream& operator<<(std::ostream& os, const Swift::ByteArray& s); -std::ostream& operator<<(std::ostream& os, const std::vector<unsigned char>& s); diff --git a/Swiften/Base/Concat.h b/Swiften/Base/Concat.h new file mode 100644 index 0000000..83a43b6 --- /dev/null +++ b/Swiften/Base/Concat.h @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2011 Remko Tronçon + * Licensed under the GNU General Public License v3. + * See Documentation/Licenses/GPLv3.txt for more information. + */ + +#pragma once + +namespace Swift { + template<typename C> + C concat(const C& c1, const C& c2) { + C result; + result.resize(c1.size() + c2.size()); + std::copy(c2.begin(), c2.end(), std::copy(c1.begin(), c1.end(), result.begin())); + return result; + } + + template<typename C> + C concat(const C& c1, const C& c2, const C& c3) { + C result; + result.resize(c1.size() + c2.size() + c3.size()); + std::copy(c3.begin(), c3.end(), std::copy(c2.begin(), c2.end(), std::copy(c1.begin(), c1.end(), result.begin()))); + return result; + } + + template<typename C> + C concat(const C& c1, const C& c2, const C& c3, const C& c4) { + C result; + result.resize(c1.size() + c2.size() + c3.size() + c4.size()); + std::copy(c4.begin(), c4.end(), std::copy(c3.begin(), c3.end(), std::copy(c2.begin(), c2.end(), std::copy(c1.begin(), c1.end(), result.begin())))); + return result; + } + + template<typename C> + C concat(const C& c1, const C& c2, const C& c3, const C& c4, const C& c5) { + C result; + result.resize(c1.size() + c2.size() + c3.size() + c4.size() + c5.size()); + std::copy(c5.begin(), c5.end(), std::copy(c4.begin(), c4.end(), std::copy(c3.begin(), c3.end(), std::copy(c2.begin(), c2.end(), std::copy(c1.begin(), c1.end(), result.begin()))))); + return result; + } + + template<typename C> + C concat(const C& c1, const C& c2, const C& c3, const C& c4, const C& c5, const C& c6) { + C result; + result.resize(c1.size() + c2.size() + c3.size() + c4.size() + c5.size() + c6.size()); + std::copy(c6.begin(), c6.end(), std::copy(c5.begin(), c5.end(), std::copy(c4.begin(), c4.end(), std::copy(c3.begin(), c3.end(), std::copy(c2.begin(), c2.end(), std::copy(c1.begin(), c1.end(), result.begin())))))); + return result; + } + + template<typename C> + C concat(const C& c1, const C& c2, const C& c3, const C& c4, const C& c5, const C& c6, const C& c7) { + C result; + result.resize(c1.size() + c2.size() + c3.size() + c4.size() + c5.size() + c6.size() + c7.size()); + std::copy(c7.begin(), c7.end(), std::copy(c6.begin(), c6.end(), std::copy(c5.begin(), c5.end(), std::copy(c4.begin(), c4.end(), std::copy(c3.begin(), c3.end(), std::copy(c2.begin(), c2.end(), std::copy(c1.begin(), c1.end(), result.begin()))))))); + return result; + } + + template<typename C> + C concat(const C& c1, const C& c2, const C& c3, const C& c4, const C& c5, const C& c6, const C& c7, const C& c8) { + C result; + result.resize(c1.size() + c2.size() + c3.size() + c4.size() + c5.size() + c6.size() + c7.size() + c8.size()); + std::copy(c8.begin(), c8.end(), std::copy(c7.begin(), c7.end(), std::copy(c6.begin(), c6.end(), std::copy(c5.begin(), c5.end(), std::copy(c4.begin(), c4.end(), std::copy(c3.begin(), c3.end(), std::copy(c2.begin(), c2.end(), std::copy(c1.begin(), c1.end(), result.begin())))))))); + return result; + } + + template<typename C> + C concat(const C& c1, const C& c2, const C& c3, const C& c4, const C& c5, const C& c6, const C& c7, const C& c8, const C& c9) { + C result; + result.resize(c1.size() + c2.size() + c3.size() + c4.size() + c5.size() + c6.size() + c7.size() + c8.size() + c9.size()); + std::copy(c9.begin(), c9.end(), std::copy(c8.begin(), c8.end(), std::copy(c7.begin(), c7.end(), std::copy(c6.begin(), c6.end(), std::copy(c5.begin(), c5.end(), std::copy(c4.begin(), c4.end(), std::copy(c3.begin(), c3.end(), std::copy(c2.begin(), c2.end(), std::copy(c1.begin(), c1.end(), result.begin()))))))))); + return result; + } +} diff --git a/Swiften/Base/Paths.cpp b/Swiften/Base/Paths.cpp index d901ff9..b40f9b8 100644 --- a/Swiften/Base/Paths.cpp +++ b/Swiften/Base/Paths.cpp @@ -24,22 +24,22 @@ boost::filesystem::path Paths::getExecutablePath() { ByteArray path; uint32_t size = 4096; path.resize(size); - if (_NSGetExecutablePath(reinterpret_cast<char*>(path.getData()), &size) == 0) { - return boost::filesystem::path(std::string(reinterpret_cast<const char*>(path.getData()), path.getSize()).c_str()).parent_path(); + if (_NSGetExecutablePath(const_cast<char*>(reinterpret_cast<const char*>(vecptr(path))), &size) == 0) { + return boost::filesystem::path(std::string(reinterpret_cast<const char*>(vecptr(path)), path.size()).c_str()).parent_path(); } #elif defined(SWIFTEN_PLATFORM_LINUX) ByteArray path; path.resize(4096); - size_t size = readlink("/proc/self/exe", reinterpret_cast<char*>(path.getData()), path.getSize()); + size_t size = readlink("/proc/self/exe", reinterpret_cast<char*>(vecptr(path)), path.size()); if (size > 0) { path.resize(size); - return boost::filesystem::path(std::string(reinterpret_cast<const char*>(path.getData()), path.getSize()).c_str()).parent_path(); + return boost::filesystem::path(std::string(reinterpret_cast<const char*>(vecptr(path)), path.size()).c_str()).parent_path(); } #elif defined(SWIFTEN_PLATFORM_WINDOWS) ByteArray data; data.resize(2048); - GetModuleFileName(NULL, reinterpret_cast<char*>(data.getData()), data.getSize()); - return boost::filesystem::path(std::string(reinterpret_cast<const char*>(data.getData()), data.getSize()).c_str()).parent_path(); + GetModuleFileName(NULL, reinterpret_cast<char*>(vecptr(data)), data.size()); + return boost::filesystem::path(std::string(reinterpret_cast<const char*>(vecptr(data)), data.size()).c_str()).parent_path(); #endif return boost::filesystem::path(); } diff --git a/Swiften/Base/UnitTest/ByteArrayTest.cpp b/Swiften/Base/UnitTest/ByteArrayTest.cpp index b663166..ecd0439 100644 --- a/Swiften/Base/UnitTest/ByteArrayTest.cpp +++ b/Swiften/Base/UnitTest/ByteArrayTest.cpp @@ -25,31 +25,31 @@ class ByteArrayTest : public CppUnit::TestFixture { void testGetData_NoData() { ByteArray testling; - CPPUNIT_ASSERT_EQUAL(reinterpret_cast<const char*>(NULL), reinterpret_cast<const char*>(testling.getData())); + CPPUNIT_ASSERT_EQUAL(reinterpret_cast<const char*>(NULL), reinterpret_cast<const char*>(vecptr(testling))); } void testToString() { - ByteArray testling(ByteArray::create("abcde")); + ByteArray testling(createByteArray("abcde")); - CPPUNIT_ASSERT_EQUAL(std::string("abcde"), testling.toString()); + CPPUNIT_ASSERT_EQUAL(std::string("abcde"), byteArrayToString(testling)); } void testToString_NullTerminated() { - ByteArray testling(ByteArray::create("abcde\0", 6)); + ByteArray testling(createByteArray("abcde\0", 6)); - CPPUNIT_ASSERT_EQUAL(std::string("abcde"), testling.toString()); + CPPUNIT_ASSERT_EQUAL(std::string("abcde"), byteArrayToString(testling)); } void testToString_TwoNullTerminated() { - ByteArray testling(ByteArray::create("abcde\0\0", 7)); + ByteArray testling(createByteArray("abcde\0\0", 7)); - CPPUNIT_ASSERT_EQUAL(std::string("abcde"), testling.toString()); + CPPUNIT_ASSERT_EQUAL(std::string("abcde"), byteArrayToString(testling)); } void testToString_AllNull() { - ByteArray testling(ByteArray::create("\0\0", 2)); + ByteArray testling(createByteArray("\0\0", 2)); - CPPUNIT_ASSERT_EQUAL(std::string(""), testling.toString()); + CPPUNIT_ASSERT_EQUAL(std::string(""), byteArrayToString(testling)); } }; |