/usr/include/okteta1/arraychangemetrics.h is in okteta-dev 4:4.8.4+dfsg-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 | /*
This file is part of the Okteta Core library, made within the KDE community.
Copyright 2008 Friedrich W. H. Kossebau <kossebau@kde.org>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) version 3, or any
later version accepted by the membership of KDE e.V. (or its
successor approved by the membership of KDE e.V.), which shall
act as a proxy defined in Section 6 of version 3 of the license.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef OKTETA_ARRAYCHANGEMETRICS_H
#define OKTETA_ARRAYCHANGEMETRICS_H
// lib
#include "oktetacore_export.h"
#include "size.h"
#include "address.h"
// Qt
#include <QtCore/QDataStream>
namespace Okteta
{
// TODO: do we need the invalid status?
class OKTETACORE_EXPORT ArrayChangeMetrics
{
friend QDataStream& operator<<( QDataStream& outStream, const ArrayChangeMetrics& metrics );
friend QDataStream& operator>>( QDataStream& inStream, ArrayChangeMetrics& metrics );
private:
static const Address InvalidAddress = -1;
public:
enum Type { /*Insertion, Removal,*/ Replacement, Swapping/*, Filling, Setting*/, Invalid };
public:
static ArrayChangeMetrics asReplacement( Address offset, Size removeLength, Size insertLength );
static ArrayChangeMetrics asSwapping( Address firstOffset, Address secondOffset, Size secondLength );
public:
ArrayChangeMetrics();
protected:
public:
ArrayChangeMetrics( Type type, Address offset, qint32 secondArgument, qint32 thirdArgument );
public:
bool operator==( const ArrayChangeMetrics& other ) const;
public:
void revert();
public:
int type() const;
Address offset() const;
bool isValid() const;
public: // Replacement properties
Size removeLength() const;
Size insertLength() const;
Size lengthChange() const;
public: // Swapping properties
Size firstLength() const;
Address secondStart() const;
Address secondEnd() const;
Size secondLength() const;
protected:
Type mType;
Address mOffset;
// TODO: how to make the arguments of the size of the largest union member?
union
{
qint32 mSecondArgument;
Size mRemoveLength;
Address mSecondStart;
};
union
{
qint32 mThirdArgument;
Size mInsertLength;
Size mSecondLength;
};
};
inline ArrayChangeMetrics ArrayChangeMetrics::asReplacement( Address offset, Size removeLength, Size insertLength )
{
return ArrayChangeMetrics( Replacement, offset, removeLength, insertLength );
}
inline ArrayChangeMetrics ArrayChangeMetrics::asSwapping( Address firstOffset, Address secondOffset, Size secondLength )
{
return ArrayChangeMetrics( Swapping, firstOffset, secondOffset, secondLength );
}
inline ArrayChangeMetrics::ArrayChangeMetrics( Type type, Address offset, qint32 secondArgument, qint32 thirdArgument )
: mType( type ), mOffset( offset ), mSecondArgument( secondArgument ), mThirdArgument( thirdArgument )
{}
inline ArrayChangeMetrics::ArrayChangeMetrics() : mType(Invalid) ,mOffset( InvalidAddress ), mSecondArgument( 0 ), mThirdArgument( 0 ) {}
inline bool ArrayChangeMetrics::operator==( const ArrayChangeMetrics& other ) const
{
return mType == other.mType
&& mOffset == other.mOffset
&& mSecondArgument == other.mSecondArgument
&& mThirdArgument == other.mThirdArgument;
}
inline void ArrayChangeMetrics::revert()
{
if( mType == Replacement )
{
const Size helper = mInsertLength;
mInsertLength = mRemoveLength;
mRemoveLength = helper;
}
else if( mType == Swapping )
{
const Size oldSecondLength = mSecondLength;
mSecondLength = firstLength();
mSecondStart = mOffset + oldSecondLength;
}
}
inline bool ArrayChangeMetrics::isValid() const { return mOffset != InvalidAddress; }
inline int ArrayChangeMetrics::type() const { return mType; }
inline Address ArrayChangeMetrics::offset() const { return mOffset; }
inline Size ArrayChangeMetrics::removeLength() const { return mRemoveLength; }
inline Size ArrayChangeMetrics::insertLength() const { return mInsertLength; }
inline Size ArrayChangeMetrics::lengthChange() const { return mInsertLength-mRemoveLength; }
inline Address ArrayChangeMetrics::secondStart() const { return mSecondStart; }
inline Address ArrayChangeMetrics::secondEnd() const { return mSecondStart+mSecondLength-1; }
inline Size ArrayChangeMetrics::firstLength() const { return mSecondStart-mOffset; }
inline Size ArrayChangeMetrics::secondLength() const { return mSecondLength; }
QDataStream& operator<<( QDataStream& outStream, const ArrayChangeMetrics& metrics );
QDataStream& operator>>( QDataStream& inStream, ArrayChangeMetrics& metrics );
inline QDataStream& operator<<( QDataStream& outStream, const ArrayChangeMetrics& metrics )
{
outStream << metrics.mType << metrics.mOffset << metrics.mSecondArgument << metrics.mThirdArgument;
return outStream;
}
inline QDataStream& operator>>( QDataStream& inStream, ArrayChangeMetrics& metrics )
{
int type;
inStream >> type >> metrics.mOffset >> metrics.mSecondArgument >> metrics.mThirdArgument;
metrics.mType = (ArrayChangeMetrics::Type)type; //TODO: find out how to stream to enum directly
return inStream;
}
}
#endif
|