add EncodedString module
This commit is contained in:
parent
3b1199fbdc
commit
fce9f87265
44
src/core/EncodedString.cc
Normal file
44
src/core/EncodedString.cc
Normal file
@ -0,0 +1,44 @@
|
||||
#include "EncodedString.h"
|
||||
#include <string.h>
|
||||
|
||||
uint32_t EncodedString::iterator::operator*()
|
||||
{
|
||||
if (m_offset >= m_encoded_string.size())
|
||||
{
|
||||
return INVALID_CODE_POINT;
|
||||
}
|
||||
return Encoding::decode(m_encoded_string.encoding(), &m_encoded_string[m_offset]);
|
||||
}
|
||||
|
||||
EncodedString::iterator & EncodedString::iterator::operator++()
|
||||
{
|
||||
if (m_offset < m_encoded_string.size())
|
||||
{
|
||||
m_offset += Encoding::num_bytes_in_code_point(m_encoded_string.encoding(), &m_encoded_string[m_offset]);
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
EncodedString::EncodedString(Encoding::Type encoding)
|
||||
: m_encoding(encoding),
|
||||
m_data(nullptr)
|
||||
{
|
||||
}
|
||||
|
||||
EncodedString::EncodedString(const uint8_t * data, size_t size, Encoding::Type encoding)
|
||||
: m_encoding(encoding),
|
||||
m_size(size)
|
||||
{
|
||||
m_data = new uint8_t[size];
|
||||
memcpy(m_data, data, size);
|
||||
}
|
||||
|
||||
EncodedString::iterator EncodedString::begin() const
|
||||
{
|
||||
return iterator(*this, 0u);
|
||||
}
|
||||
|
||||
EncodedString::iterator EncodedString::end() const
|
||||
{
|
||||
return iterator(*this, m_size);
|
||||
}
|
63
src/core/EncodedString.h
Normal file
63
src/core/EncodedString.h
Normal file
@ -0,0 +1,63 @@
|
||||
#ifndef ENCODEDSTRING_H
|
||||
#define ENCODEDSTRING_H
|
||||
|
||||
#include "Encoding.h"
|
||||
#include <stdint.h>
|
||||
|
||||
class EncodedString
|
||||
{
|
||||
public:
|
||||
enum : uint32_t
|
||||
{
|
||||
INVALID_CODE_POINT = 0xFFFFFFFFu,
|
||||
};
|
||||
|
||||
class iterator
|
||||
{
|
||||
public:
|
||||
iterator(const EncodedString & encoded_string, size_t offset)
|
||||
: m_encoded_string(encoded_string),
|
||||
m_offset(offset)
|
||||
{
|
||||
}
|
||||
uint32_t operator*();
|
||||
iterator & operator++();
|
||||
bool operator==(const iterator & other) const
|
||||
{
|
||||
return m_offset == other.m_offset;
|
||||
}
|
||||
bool operator!=(const iterator & other) const
|
||||
{
|
||||
return m_offset != other.m_offset;
|
||||
}
|
||||
|
||||
protected:
|
||||
const EncodedString & m_encoded_string;
|
||||
size_t m_offset;
|
||||
};
|
||||
|
||||
EncodedString(Encoding::Type encoding = Encoding::UTF_8);
|
||||
EncodedString(const uint8_t * data, size_t size, Encoding::Type encoding = Encoding::UTF_8);
|
||||
|
||||
iterator begin() const;
|
||||
iterator end() const;
|
||||
size_t size() const
|
||||
{
|
||||
return m_size;
|
||||
}
|
||||
Encoding::Type encoding() const
|
||||
{
|
||||
return m_encoding;
|
||||
}
|
||||
const uint8_t & operator[](size_t index) const
|
||||
{
|
||||
return m_data[index];
|
||||
}
|
||||
|
||||
protected:
|
||||
Encoding::Type m_encoding;
|
||||
uint8_t * m_data;
|
||||
size_t m_size;
|
||||
};
|
||||
|
||||
#endif
|
Loading…
x
Reference in New Issue
Block a user