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