File indexing completed on 2024-06-30 05:51:26
0001 /* 0002 This file is part of the Okteta Kasten Framework, made within the KDE community. 0003 0004 SPDX-FileCopyrightText: 2011 Alex Richardson <alex.richardson@gmx.de> 0005 0006 SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL 0007 */ 0008 0009 #ifndef KASTEN_STRINGDATA_HPP 0010 #define KASTEN_STRINGDATA_HPP 0011 0012 #include <Okteta/Address> 0013 #include "../datainformationbase.hpp" 0014 // Qt 0015 #include <QSysInfo> 0016 0017 class StringDataInformation; 0018 0019 namespace Okteta { 0020 class AbstractByteArrayModel; 0021 } 0022 0023 class StringData 0024 { 0025 public: 0026 enum TerminationMode 0027 { 0028 None = 0x0, 0029 Sequence = 0x1, // termination sequence (i.e. '\0') 0030 CharCount = 0x2, // numer of unicode code points 0031 ByteCount = 0x4, // maximum number of bytes 0032 SeqOrCharCount = CharCount + Sequence, // whatever comes first 0033 SeqOrByteCount = ByteCount + Sequence // whatever comes first 0034 }; 0035 Q_DECLARE_FLAGS(TerminationModes, TerminationMode) 0036 0037 explicit StringData(StringDataInformation* parent); 0038 StringData(const StringData&) = delete; 0039 0040 virtual ~StringData(); 0041 0042 StringData& operator=(const StringData&) = delete; 0043 0044 public: 0045 virtual QString typeName() const = 0; 0046 virtual uint count() const = 0; 0047 virtual QString charType() const = 0; 0048 virtual QString stringValue(int row) const = 0; 0049 virtual QString completeString(bool skipInvalid = false) const = 0; 0050 virtual BitCount32 size() const = 0; 0051 virtual BitCount32 sizeAt(uint index) const = 0; 0052 virtual qint64 read(const Okteta::AbstractByteArrayModel* input, Okteta::Address address, BitCount64 bitsRemaining) = 0; 0053 /** by default just sets value, if more logic is needed can be overridden */ 0054 virtual void setEndianness(QSysInfo::Endian endianness); 0055 TerminationMode terminationMode() const; 0056 void setTerminationMode(TerminationMode mode); 0057 0058 bool wasEof() const; 0059 0060 uint maxByteCount() const; 0061 void setMaxByteCount(uint count); 0062 uint maxCharCount() const; 0063 void setMaxCharCount(uint count); 0064 uint terminationCodePoint() const; 0065 void setTerminationCodePoint(quint32 term); 0066 0067 void copyTerminationFrom(const StringData* data); 0068 0069 static constexpr uint UNICODE_MAX = 0x10ffff; 0070 static constexpr uint BMP_MAX = 0xffff; 0071 static constexpr char ASCII_MAX = 0x7f; 0072 0073 protected: 0074 StringDataInformation* mParent; 0075 union { 0076 uint maxChars; 0077 uint maxBytes; 0078 } mLength; 0079 quint32 mTerminationCodePoint = 0; 0080 uint mMode : 4; 0081 bool mLittleEndian : 1; 0082 bool mEofReached : 1; 0083 0084 }; 0085 0086 Q_DECLARE_OPERATORS_FOR_FLAGS(StringData::TerminationModes) 0087 0088 inline uint StringData::terminationCodePoint() const 0089 { 0090 return mTerminationCodePoint; 0091 } 0092 0093 inline uint StringData::maxByteCount() const 0094 { 0095 return mLength.maxBytes; 0096 } 0097 0098 inline void StringData::setMaxByteCount(uint count) 0099 { 0100 mLength.maxBytes = count; 0101 mMode |= ByteCount; 0102 mMode &= ~CharCount; 0103 } 0104 0105 inline uint StringData::maxCharCount() const 0106 { 0107 return mLength.maxChars; 0108 } 0109 0110 inline void StringData::setMaxCharCount(uint count) 0111 { 0112 mLength.maxChars = count; 0113 mMode |= CharCount; 0114 mMode &= ~ByteCount; 0115 } 0116 0117 inline void StringData::copyTerminationFrom(const StringData* data) 0118 { 0119 mMode = data->mMode; 0120 mTerminationCodePoint = data->mTerminationCodePoint; 0121 mLength = data->mLength; 0122 } 0123 0124 inline StringData::TerminationMode StringData::terminationMode() const 0125 { 0126 return static_cast<TerminationMode>(mMode); 0127 } 0128 0129 inline void StringData::setTerminationMode(StringData::TerminationMode mode) 0130 { 0131 mMode = mode; 0132 } 0133 0134 inline bool StringData::wasEof() const 0135 { 0136 return mEofReached; 0137 } 0138 0139 #endif // KASTEN_STRINGDATA_HPP