diff options
Diffstat (limited to 'src/libs/cplusplus/PPToken.h')
-rw-r--r-- | src/libs/cplusplus/PPToken.h | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/src/libs/cplusplus/PPToken.h b/src/libs/cplusplus/PPToken.h new file mode 100644 index 0000000000..82076872ef --- /dev/null +++ b/src/libs/cplusplus/PPToken.h @@ -0,0 +1,106 @@ +#ifndef CPLUSPLUS_INTERNAL_PPTOKEN_H +#define CPLUSPLUS_INTERNAL_PPTOKEN_H + +#include <CPlusPlus.h> +#include <Token.h> + +#include <QByteArray> + +namespace CPlusPlus { +namespace Internal { + +class CPLUSPLUS_EXPORT ByteArrayRef +{ +public: + ByteArrayRef(); + + ByteArrayRef(const QByteArray *ref) + : m_ref(ref) + , m_offset(0) + , m_length(ref->length()) + {} + + ByteArrayRef(const QByteArray *ref, int offset, int length) + : m_ref(ref) + , m_offset(offset) + , m_length(length) + { + Q_ASSERT(ref); + Q_ASSERT(offset >= 0); + Q_ASSERT(length >= 0); + Q_ASSERT(offset + length <= ref->size()); + } + + inline const char *start() const + { return m_ref ? m_ref->constData() + m_offset : 0; } + + inline int length() const + { return m_length; } + + inline int size() const + { return length(); } + + inline char at(int pos) const + { return m_ref && pos >= 0 && pos < m_length ? m_ref->at(m_offset + pos) : '\0'; } + + inline char operator[](int pos) const + { return at(pos); } + + QByteArray toByteArray() const + { return m_ref ? QByteArray(m_ref->constData() + m_offset, m_length) : QByteArray(); } + + bool operator==(const QByteArray &other) const + { return m_ref ? (m_length == other.length() && !qstrncmp(m_ref->constData() + m_offset, other.constData(), m_length)) : false; } + bool operator!=(const QByteArray &other) const + { return !this->operator==(other); } + + bool startsWith(const char *ch) const; + + int count(char c) const; + +private: + const QByteArray *m_ref; + int m_offset; + int m_length; +}; + +inline bool operator==(const QByteArray &other, const ByteArrayRef &ref) +{ return ref == other; } + +inline bool operator!=(const QByteArray &other, const ByteArrayRef &ref) +{ return ref != other; } + +class CPLUSPLUS_EXPORT PPToken: public Token +{ +public: + PPToken(); + + PPToken(const QByteArray &src) + : m_src(src) + {} + + void setSource(const QByteArray &src) + { m_src = src; } + + const QByteArray &source() const + { return m_src; } + + const char *start() const + { return m_src.constData() + offset; } + + ByteArrayRef asByteArrayRef() const + { return ByteArrayRef(&m_src, offset, length()); } + + bool isValid() const + { return !m_src.isEmpty(); } + + void squeeze(); + +private: + QByteArray m_src; +}; + +} // namespace Internal +} // namespace CPlusPlus + +#endif // CPLUSPLUS_INTERNAL_PPTOKEN_H |