Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merge to master for v0.5.2 #119

Merged
merged 7 commits into from
Aug 9, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ cmake_minimum_required(VERSION 3.23.0...3.26.0)
# avoided and only used for hotfixes. DON'T USE TRAILING
# ZEROS IN VERSIONS
project(Qx
VERSION 0.5.1.1
VERSION 0.5.2
LANGUAGES CXX
DESCRIPTION "Qt Extensions Library"
)
Expand Down
56 changes: 31 additions & 25 deletions lib/core/include/qx/core/qx-index.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,32 +22,46 @@ class Index
//-Class Types----------------------------------------------------------------------------------------------------
private:
enum class Type {Null, End, Value};
struct LastKey {};

//-Class Members----------------------------------------------------------------------------------------------------
public:
static const Index<T> FIRST;
static const Index<T> LAST;
enum Extent
{
First,
Last
};

//-Instance Members----------------------------------------------------------------------------------------------------
private:
Type mType;
T mValue;

//-Constructor----------------------------------------------------------------------------------------------
private:
Index(LastKey) :
mType(Type::End),
mValue(std::numeric_limits<T>::max())
{}

public:
Index() :
constexpr Index() :
mType(Type::Null),
mValue(0)
{}

Index(T value) :
constexpr Index(Extent e)
{
switch(e)
{
case First:
mType = Type::Value;
mValue = 0;
break;

case Last:
mType = Type::End;
mValue = std::numeric_limits<T>::max();
break;

default:
qCritical("Invalid extent");
}
}

constexpr Index(T value) :
mType(Type::Value),
mValue(value)
{
Expand All @@ -70,7 +84,7 @@ class Index
// template<typename N> requires std::integral<N>
// bool operator==(const N& integer) const { return mType == Type::Value && static_cast<N>(mValue) == integer; }

auto operator<=>(const Index& other) const noexcept {
std::strong_ordering operator<=>(const Index& other) const noexcept {
switch(mType)
{
case Type::Null:
Expand All @@ -93,7 +107,7 @@ class Index
if(other.mType == Type::End)
return 0;
else if(mType == Type::End)
return LAST;
return Index(Last);
else
return constrainedSub(mValue, other.mValue, 0);
}
Expand All @@ -103,7 +117,7 @@ class Index
Index operator+(const Index& other)
{
return (mType == Type::End || other.mType == Type::End) ?
LAST : constrainedAdd(mValue, other.mValue, 0);
Index(Last) : constrainedAdd(mValue, other.mValue, 0);
}


Expand All @@ -117,7 +131,7 @@ class Index
if(other.mType == Type::End)
return mType == Type::End ? 1 : 0;
else if(mType == Type::End)
return LAST;
return Index(Last);
else
return constrainedDiv(mValue, other.mValue, 0);
}
Expand All @@ -129,7 +143,7 @@ class Index
if(mValue == 0 || other.mValue == 0)
return 0;
else if(mType == Type::End || other.mType == Type::End)
return LAST;
return Index(Last);
else
return constrainedMult(mValue, other.mValue, 0);

Expand Down Expand Up @@ -289,14 +303,6 @@ class Index
// friend T& operator*=(N& integer, const Index<T>& index) { integer *= static_cast<N>(index.mValue); return integer; }
};

//-Outer Class Definitions----------------------------------------------------------------------------------
template<typename T>
requires std::signed_integral<T>
const Index<T> Index<T>::FIRST = Index<T>(0);
template<typename T>
requires std::signed_integral<T>
const Index<T> Index<T>::LAST = Index<T>(LastKey{});

//-Outer Class Types----------------------------------------------------------------------------------------
typedef Index<qint8> Index8;
typedef Index<qint16> Index16;
Expand Down
37 changes: 17 additions & 20 deletions lib/core/src/qx-index.dox
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ namespace Qx
* use -1 to mean 'none' in the context of searches.
*
* The Index type is designed to remedy this issue by providing a more distinct representation of a set's final index
* via the member variable Index<T>::LAST, which for completeness is paired with Index<T>::FIRST. The type also
* via the constructor Index(Extent), which can also be used to more explicitly reference the first index. The type also
* can be null, providing further clarity for the 'none' case.
*
* To minimize unintentional interactions, Index<T> only has comparison and arithmetic operators defined for when
Expand Down Expand Up @@ -52,20 +52,19 @@ namespace Qx
* @li 2) 'last' indices are greater than everything except other 'last' indices (highest possible value)
*/

//-Class Members----------------------------------------------------------------------------------------------------
//-Class Types----------------------------------------------------------------------------------------------------
//Public:
// TODO: Report this as a Doxygen bug, likely should need to be Index<T>::Extent
/*!
* @var Index<T> Index<T>::FIRST
* @enum Index::Extent
*
* Used to refer to the first index of a dataset.
* Used to refer to indicies of special significance.
*
* This is equivalent to @c Index<T>(0).
*/

/*!
* @var Index<T> Index<T>::LAST
* @var Index<T>::Extent Index<T>::First
* The first index, equivalent to @c Index<T>(0).
*
* Used to refer to the last index of a dataset.
* @var Index<T>::Extent Index<T>::Last
* The last index.
*/

//-Constructor----------------------------------------------------------------------------------------------
Expand All @@ -76,6 +75,12 @@ namespace Qx
* Creates an null index.
*/

/*!
* @fn Index<T>::Index(Extent e)
*
* Creates an index at the given extent @a e.
*/

/*!
* @fn Index<T>::Index(T value)
*
Expand All @@ -97,15 +102,7 @@ namespace Qx
*
* Returns @c true if the index represents the last index of an arbitrary dataset; otherwise returns @c false.
*
* This is equivalent to <tt>*this == Index<T>::LAST</tt>.
*/

/*!
* @fn bool Index<T>::isLast() const
*
* Returns @c true if the index represents the last index of an arbitrary dataset; otherwise returns @c false.
*
* This is equivalent to <tt>*this == Index<T>::LAST</tt>.
* This is equivalent to <tt>*this == Index<T>(Last)</tt>.
*/

//-Operators-------------------------------------------------------------------------------------------------------
Expand All @@ -118,7 +115,7 @@ namespace Qx
*/

/*!
* @fn auto Index<T>::operator<=>(const Index& other) const noexcept
* @fn std::strong_ordering Index<T>::operator<=>(const Index& other) const noexcept
*
* Performs a three-way comparison between this index and @a other.
*
Expand Down
10 changes: 5 additions & 5 deletions lib/io/include/qx/io/qx-common-io.h
Original file line number Diff line number Diff line change
Expand Up @@ -62,10 +62,10 @@ QX_IO_EXPORT IoOpReport textFileAbsolutePosition(TextPos& textPos, QFile& textFi
QX_IO_EXPORT IoOpReport findStringInFile(QList<TextPos>& returnBuffer, QFile& textFile, const TextQuery& query, ReadOptions readOptions = NoReadOptions);
QX_IO_EXPORT IoOpReport fileContainsString(bool& returnBuffer, QFile& textFile, const QString& query, Qt::CaseSensitivity caseSensitivity = Qt::CaseSensitive, bool allowSplit = false);
QX_IO_EXPORT IoOpReport readTextFromFile(QString& returnBuffer, QFile& textFile, TextPos startPos, int count, ReadOptions readOptions = NoReadOptions);
QX_IO_EXPORT IoOpReport readTextFromFile(QString& returnBuffer, QFile& textFile, TextPos startPos = TextPos::START, TextPos endPos = TextPos::END, ReadOptions readOptions = NoReadOptions);
QX_IO_EXPORT IoOpReport readTextFromFile(QStringList& returnBuffer, QFile& textFile, Index32 startLine = 0, Index32 endLine = Index32::LAST, ReadOptions readOptions = NoReadOptions);
QX_IO_EXPORT IoOpReport writeStringToFile(QFile& textFile, const QString& text, WriteMode writeMode = Truncate, TextPos startPos = TextPos::START, WriteOptions writeOptions = NoWriteOptions);
QX_IO_EXPORT IoOpReport writeStringToFile(QSaveFile& textFile, const QString& text, WriteMode writeMode = Truncate, TextPos startPos = TextPos::START, WriteOptions writeOptions = NoWriteOptions);
QX_IO_EXPORT IoOpReport readTextFromFile(QString& returnBuffer, QFile& textFile, TextPos startPos = TextPos(TextPos::Start), TextPos endPos = TextPos(TextPos::End), ReadOptions readOptions = NoReadOptions);
QX_IO_EXPORT IoOpReport readTextFromFile(QStringList& returnBuffer, QFile& textFile, Index32 startLine = 0, Index32 endLine = Index32(Index32::Last), ReadOptions readOptions = NoReadOptions);
QX_IO_EXPORT IoOpReport writeStringToFile(QFile& textFile, const QString& text, WriteMode writeMode = Truncate, TextPos startPos = TextPos(TextPos::Start), WriteOptions writeOptions = NoWriteOptions);
QX_IO_EXPORT IoOpReport writeStringToFile(QSaveFile& textFile, const QString& text, WriteMode writeMode = Truncate, TextPos startPos = TextPos(TextPos::Start), WriteOptions writeOptions = NoWriteOptions);
QX_IO_EXPORT IoOpReport deleteTextFromFile(QFile& textFile, TextPos startPos, TextPos endPos);

// Directory:
Expand All @@ -81,7 +81,7 @@ QX_IO_EXPORT IoOpReport calculateFileChecksum(QString& returnBuffer, QFile& file
QX_IO_EXPORT IoOpReport fileMatchesChecksum(bool& returnBuffer, QFile& file, QString checksum, QCryptographicHash::Algorithm hashAlgorithm);

// Binary Based
QX_IO_EXPORT IoOpReport readBytesFromFile(QByteArray& returnBuffer, QFile& file, Index64 startPos = 0, Index64 endPos = Index64::LAST);
QX_IO_EXPORT IoOpReport readBytesFromFile(QByteArray& returnBuffer, QFile& file, Index64 startPos = 0, Index64 endPos = Index64(Index64::Last));
QX_IO_EXPORT IoOpReport writeBytesToFile(QFile& file, const QByteArray& bytes, WriteMode writeMode = Truncate, Index64 startPos = 0, WriteOptions writeOptions = NoWriteOptions);
QX_IO_EXPORT IoOpReport writeBytesToFile(QSaveFile& file, const QByteArray& bytes, WriteMode writeMode = Truncate, Index64 startPos = 0, WriteOptions writeOptions = NoWriteOptions);
}
Expand Down
20 changes: 12 additions & 8 deletions lib/io/include/qx/io/qx-textpos.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,22 @@
// Extra-component Includes
#include "qx/core/qx-index.h"

// TODO: This class should probably be constexpr construable, though this
// would mean it cant have separate implementation files which is somewhat ugly.
// probably should reconsider this once using modules.

namespace Qx
{

class QX_IO_EXPORT TextPos
{
//-Class Types------------------------------------------------------------------------------------------------------
public:
static const TextPos START;
static const TextPos END;
enum Extent
{
Start,
End
};

//-Instance Variables------------------------------------------------------------------------------------------------
private:
Expand All @@ -25,6 +32,7 @@ class QX_IO_EXPORT TextPos
//-Constructor-------------------------------------------------------------------------------------------------------
public:
TextPos();
TextPos(Extent e);
TextPos(Index32 line, Index32 character);

//-Instance Functions------------------------------------------------------------------------------------------------
Expand All @@ -35,12 +43,8 @@ class QX_IO_EXPORT TextPos
void setCharacter(Index32 character);
bool isNull() const;

bool operator== (const TextPos& otherTextPos);
bool operator!= (const TextPos& otherTextPos);
bool operator> (const TextPos& otherTextPos);
bool operator>= (const TextPos& otherTextPos);
bool operator< (const TextPos& otherTextPos);
bool operator<= (const TextPos& otherTextPos);
bool operator==(const TextPos& other) const noexcept = default;
std::strong_ordering operator<=>(const TextPos& other) const noexcept;
};

}
Expand Down
26 changes: 13 additions & 13 deletions lib/io/src/qx-common-io.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -378,9 +378,9 @@ IoOpReport textFileLineCount(int& returnBuffer, QFile& textFile, bool ignoreTrai

/*!
* Converts any relative component of @a textPos to an absolute one. I.e. determines the actual line
* and or/character that Index32::LAST references for the given @a textFile, if present.
* and or/character that Index32(Index32::Last) references for the given @a textFile, if present.
*
* If neither the line or character component of @a textPos contain the value Index32::LAST,
* If neither the line or character component of @a textPos contain the value Index32(Index32::Last),
* @a textPos is left unchanged.
*
* @param[in,out] textPos The text position to translate into an absolute position.
Expand Down Expand Up @@ -459,7 +459,7 @@ IoOpReport findStringInFile(QList<TextPos>& returnBuffer, QFile& textFile, const

// Query tracking
TextPos trueStartPos = query.startPosition();
TextPos currentPos = TextPos::START;
TextPos currentPos = TextPos(TextPos::Start);
TextPos possibleMatch = TextPos();
int hitsSkipped = 0;
QString::const_iterator queryIt = query.string().constBegin();
Expand All @@ -469,7 +469,7 @@ IoOpReport findStringInFile(QList<TextPos>& returnBuffer, QFile& textFile, const
QTextStream fileTextStream(&textFile);

// Translate start position to absolute position
if(trueStartPos != TextPos::START)
if(trueStartPos != TextPos(TextPos::Start))
{
IoOpReport translate = textFileAbsolutePosition(trueStartPos, textFile, readOptions.testFlag(IgnoreTrailingBreak));
if(translate.isFailure())
Expand All @@ -489,7 +489,7 @@ IoOpReport findStringInFile(QList<TextPos>& returnBuffer, QFile& textFile, const
QScopeGuard fileGuard([&textFile](){ textFile.close(); });

// Skip to start pos
if(trueStartPos != TextPos::START)
if(trueStartPos != TextPos(TextPos::Start))
{
int line;
// Skip to start line
Expand Down Expand Up @@ -739,7 +739,7 @@ IoOpReport readTextFromFile(QString& returnBuffer, QFile& textFile, TextPos star
TextStream fileTextStream(&textFile);

// Cover each possible range type
if(startPos == TextPos::START && endPos == TextPos::END) // Whole file is desired
if(startPos == TextPos(TextPos::Start) && endPos == TextPos(TextPos::End)) // Whole file is desired
{
returnBuffer = fileTextStream.readAll();

Expand Down Expand Up @@ -999,7 +999,7 @@ namespace

// Fill beforeNew
TextPos beforeEnd = TextPos(startPos.line(), startPos.character() - 1);
IoOpReport readBefore = readTextFromFile(beforeNew, auxFile, TextPos::START, beforeEnd);
IoOpReport readBefore = readTextFromFile(beforeNew, auxFile, TextPos(TextPos::Start), beforeEnd);
if(readBefore.isFailure())
return readBefore;

Expand Down Expand Up @@ -1178,27 +1178,27 @@ IoOpReport deleteTextFromFile(QFile& textFile, TextPos startPos, TextPos endPos)
IoOpReport transientReport;

// Determine beforeDeletion
if(startPos == TextPos::START) // (0,0)
if(startPos == TextPos(TextPos::Start)) // (0,0)
beforeDeletion = u""_s;
else if(startPos.character().isLast())
{
transientReport = readTextFromFile(beforeDeletion, textFile, TextPos::START, startPos);
transientReport = readTextFromFile(beforeDeletion, textFile, TextPos(TextPos::Start), startPos);
beforeDeletion.chop(1);
}
else
transientReport = readTextFromFile(beforeDeletion, textFile, TextPos::START, TextPos(startPos.line(), startPos.character() - 1));
transientReport = readTextFromFile(beforeDeletion, textFile, TextPos(TextPos::Start), TextPos(startPos.line(), startPos.character() - 1));

// Check for transient errors
if(!transientReport.isNull() && transientReport.result() != IO_SUCCESS)
return IoOpReport(IO_OP_WRITE, transientReport.result(), textFile);

// Determine afterDeletion
if(endPos == TextPos::END)
if(endPos == TextPos(TextPos::End))
afterDeletion = u""_s;
else if(endPos.character().isLast())
transientReport = readTextFromFile(afterDeletion, textFile, TextPos(endPos.line() + 1, 0), TextPos::END);
transientReport = readTextFromFile(afterDeletion, textFile, TextPos(endPos.line() + 1, 0), TextPos(TextPos::End));
else
transientReport = readTextFromFile(afterDeletion, textFile, TextPos(endPos.line(), endPos.character() + 1), TextPos::END);
transientReport = readTextFromFile(afterDeletion, textFile, TextPos(endPos.line(), endPos.character() + 1), TextPos(TextPos::End));

// Check for transient errors
if(transientReport.result() != IO_SUCCESS)
Expand Down
4 changes: 2 additions & 2 deletions lib/io/src/qx-common-io_p.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -132,10 +132,10 @@ IoOpReport writePrep(const QFileInfo& fileInfo, WriteOptions writeOptions)
void matchAppendConditionParams(WriteMode& writeMode, TextPos& startPos)
{
// Match append condition parameters
if(startPos == TextPos::END)
if(startPos == TextPos(TextPos::End))
writeMode = Append;
else if(writeMode == Append)
startPos = TextPos::END;
startPos = TextPos(TextPos::End);
}

/*! @endcond */
Expand Down
2 changes: 1 addition & 1 deletion lib/io/src/qx-common-io_p.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ void matchAppendConditionParams(WriteMode& writeMode, Index<T>& startPos)
if(startPos.isLast())
writeMode = Append;
else if(writeMode == Append)
startPos = Index<T>::LAST;
startPos = Index<T>(Index<T>::Last);
}
/*! @endcond */
}
Expand Down
Loading
Loading