Files
Work/guitar/requirements.cpp
2024-08-07 09:16:27 -04:00

78 lines
2.0 KiB
C++

#include <guitar/requirements.hpp>
#include <common/qsort.hpp>
void Requirements::setRequirements(Block<Note> &notes)
{
size(notes.size());
for(int index=0;index<notes.size();index++)
{
operator[](index)=FrettedNote(notes[index],-1,-1);
}
}
bool Requirements::satisfyRequirements(NotePaths &notePaths)
{
Array<Ordering> searchOrder;
searchOrder.size(notePaths.size());
for(int index=0;index<notePaths.size();index++)
{
NotePath &notePath=notePaths[index];
searchOrder[index]=Ordering(notePath.size(),index);
}
QuickSort<Ordering> sortOrder;
sortOrder.sortItems(searchOrder); // sort the sets in ascending order (ie) first item contains least number of solutions sets
for(index=0;index<searchOrder.size();index++)
{
satisfyRequirement(notePaths[searchOrder[index].getValue()]);
}
return false;
}
bool Requirements::satisfyRequirement(NotePath &notePath)
{
bool satisfied=false;
PtrRequirement requirement;
if(!notePath.size())return satisfied;
for(int pathIndex=0;pathIndex<notePath.size();pathIndex++)
{
FrettedNote &frettedNote=notePath[pathIndex];
if(isPositionAvailable(frettedNote,requirement))
{
*requirement=frettedNote;
requirement->setSatisfied(true);
satisfied=true;
break;
}
}
return satisfied;
}
bool Requirements::isPositionAvailable(const FrettedNote &frettedNote,PtrRequirement &requirement)
{
for(int index=0;index<size();index++)
{
requirement=&operator[](index);
// ::OutputDebugString(requirement->toString()+String("\n"));
// ::OutputDebugString(frettedNote.toString()+String("\n"));
if(requirement->getNote()==frettedNote.getNote()&&
requirement->getOctave()==frettedNote.getOctave()&&
!requirement->getSatisfied())return true;
}
return false;
}
bool Requirements::haveRequirement(const FrettedNote &frettedNote)
{
for(int index=0;index<size();index++)
{
Requirement &requirement=operator[](index);
if((requirement.getNote()==frettedNote.getNote())&&(requirement.getOctave()==frettedNote.getOctave())&&!requirement.getSatisfied())
{
return true;
}
}
return false;
}