78 lines
2.0 KiB
C++
78 lines
2.0 KiB
C++
#include <guitar/requirements.hpp>
|
|
#include <common/qsort.hpp>
|
|
|
|
void Requirements::setRequirements(Block<Note> ¬es)
|
|
{
|
|
size(notes.size());
|
|
for(int index=0;index<notes.size();index++)
|
|
{
|
|
operator[](index)=FrettedNote(notes[index],-1,-1);
|
|
}
|
|
}
|
|
|
|
bool Requirements::satisfyRequirements(NotePaths ¬ePaths)
|
|
{
|
|
Array<Ordering> searchOrder;
|
|
|
|
searchOrder.size(notePaths.size());
|
|
for(int index=0;index<notePaths.size();index++)
|
|
{
|
|
NotePath ¬ePath=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 ¬ePath)
|
|
{
|
|
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;
|
|
}
|