cog/Frameworks/OpenMPT.old/OpenMPT/soundlib/RowVisitor.h

90 lines
2.8 KiB
C++

/*
* RowVisitor.h
* ------------
* Purpose: Class for managing which rows of a song has already been visited. Useful for detecting backwards jumps, loops, etc.
* Notes : See implementation file.
* Authors: OpenMPT Devs
* The OpenMPT source code is released under the BSD license. Read LICENSE for more details.
*/
#pragma once
#include "BuildSettings.h"
#include <vector>
#include "Snd_defs.h"
OPENMPT_NAMESPACE_BEGIN
class CSoundFile;
class ModSequence;
class RowVisitor
{
protected:
// Memory for every row in the module if it has been visited or not.
std::vector<std::vector<bool>> m_visitedRows;
// Memory of visited rows (including their order) to reset pattern loops.
std::vector<ROWINDEX> m_visitOrder;
const CSoundFile &m_sndFile;
ORDERINDEX m_currentOrder;
SEQUENCEINDEX m_sequence;
public:
RowVisitor(const CSoundFile &sf, SEQUENCEINDEX sequence = SEQUENCEINDEX_INVALID);
void MoveVisitedRowsFrom(RowVisitor &other);
// Resize / Clear the row vector.
// If reset is true, the vector is not only resized to the required dimensions, but also completely cleared (i.e. all visited rows are unset).
void Initialize(bool reset);
// Mark a row as visited.
void Visit(ORDERINDEX ord, ROWINDEX row)
{
SetVisited(ord, row, true);
}
// Mark a row as not visited.
void Unvisit(ORDERINDEX ord, ROWINDEX row)
{
SetVisited(ord, row, false);
}
// Returns whether a given row has been visited yet.
// If autoSet is true, the queried row will automatically be marked as visited.
// Use this parameter instead of consecutive IsRowVisited / SetRowVisited calls.
bool IsVisited(ORDERINDEX ord, ROWINDEX row, bool autoSet);
// Get the needed vector size for a given pattern.
size_t GetVisitedRowsVectorSize(PATTERNINDEX pattern) const;
// Find the first row that has not been played yet.
// The order and row is stored in the order and row variables on success, on failure they contain invalid values.
// If onlyUnplayedPatterns is true (default), only completely unplayed patterns are considered, otherwise a song can start anywhere.
// Function returns true on success.
bool GetFirstUnvisitedRow(ORDERINDEX &order, ROWINDEX &row, bool onlyUnplayedPatterns) const;
// Set all rows of a previous pattern loop as unvisited.
void ResetPatternLoop(ORDERINDEX ord, ROWINDEX startRow);
// Returns the last visited row index of the current pattern, or ROWINDEX_INVALID if there is none.
ROWINDEX GetLastVisitedRow() const;
protected:
// (Un)sets a given row as visited.
// order, row - which row should be (un)set
// If visited is true, the row will be set as visited.
void SetVisited(ORDERINDEX ord, ROWINDEX row, bool visited);
// Add a row to the visited row memory for this pattern.
void AddVisitedRow(ORDERINDEX ord, ROWINDEX row);
const ModSequence &Order() const;
};
OPENMPT_NAMESPACE_END