diff --git a/README.md b/README.md index aba9cea..a000390 100644 --- a/README.md +++ b/README.md @@ -213,7 +213,8 @@ int main() auto sections = ParseSectionsFromChart(content.c_str()); - auto metaData = ParseMetaDataFromChartSections(sections); + auto metaData = ParseMetaDataFromChartSection( + sections.at(ToString(NamedSection::Song))); std::cout << metaData["Name"] << std::endl; // Example Song std::cout << metaData["Resolution"] << std::endl; // 192 @@ -255,7 +256,8 @@ int main() auto sections = ParseSectionsFromChart(content.c_str()); - auto timeSignatures = ParseTimeSignaturesFromChartSections(sections); + auto timeSignatures = ParseTimeSignaturesFromChartSection( + sections.at(ToString(NamedSection::SyncTrack))); std::cout << size(timeSignatures) << std::endl; // 4 @@ -295,7 +297,8 @@ int main() auto sections = ParseSectionsFromChart(content.c_str()); - auto bpm = ParseBpmFromChartSections(sections); + auto bpm = ParseBpmFromChartSection( + sections.at(ToString(NamedSection::SyncTrack))); std::cout << size(bpm) << std::endl; // 7 @@ -335,7 +338,8 @@ int main() auto sections = ParseSectionsFromChart(content.c_str()); - auto notes = ParseNotesFromChartSections(sections, Expert); + auto notes = ParseNotesFromChartSection( + sections.at(ToString(Difficulty::Expert) + "Single")); for (auto ¬e : notes) { @@ -383,7 +387,8 @@ int main() auto sections = ParseSectionsFromChart(content.c_str()); - auto lyrics = ParseLyricsFromChartSections(sections); + auto lyrics = ParseLyricsFromChartSection( + sections.at(ToString(NamedSection::Events))); std::cout << size(lyrics) << std::endl; // 12 diff --git a/RhythmGameUtilities.Tests/ParsersTest.cs b/RhythmGameUtilities.Tests/ParsersTest.cs index 396c00a..2365ea9 100644 --- a/RhythmGameUtilities.Tests/ParsersTest.cs +++ b/RhythmGameUtilities.Tests/ParsersTest.cs @@ -22,7 +22,7 @@ public void TestParseSectionsFromChart() } [Test] - public void TestParseValuesFromChartSections() + public void TestParseValuesFromChartSection() { var sections = Parsers.ParseSectionsFromChart(Mocks.SONG_CHART); @@ -58,7 +58,7 @@ public void TestParseTimeSignaturesFromChartSection() } [Test] - public void TestParseBpmFromChartSections() + public void TestParseBpmFromChartSection() { var sections = Parsers.ParseSectionsFromChart(Mocks.SONG_CHART); @@ -68,7 +68,7 @@ public void TestParseBpmFromChartSections() } [Test] - public void TestParseNotesFromChartSections() + public void TestParseNotesFromChartSection() { var sections = Parsers.ParseSectionsFromChart(Mocks.SONG_CHART); @@ -78,7 +78,7 @@ public void TestParseNotesFromChartSections() } [Test] - public void TestParseLyricsFromChartSections() + public void TestParseLyricsFromChartSection() { var sections = Parsers.ParseSectionsFromChart(Mocks.SONG_CHART); diff --git a/UnityPackage/Editor/Tests/ParsersTest.cs b/UnityPackage/Editor/Tests/ParsersTest.cs index 396c00a..2365ea9 100644 --- a/UnityPackage/Editor/Tests/ParsersTest.cs +++ b/UnityPackage/Editor/Tests/ParsersTest.cs @@ -22,7 +22,7 @@ public void TestParseSectionsFromChart() } [Test] - public void TestParseValuesFromChartSections() + public void TestParseValuesFromChartSection() { var sections = Parsers.ParseSectionsFromChart(Mocks.SONG_CHART); @@ -58,7 +58,7 @@ public void TestParseTimeSignaturesFromChartSection() } [Test] - public void TestParseBpmFromChartSections() + public void TestParseBpmFromChartSection() { var sections = Parsers.ParseSectionsFromChart(Mocks.SONG_CHART); @@ -68,7 +68,7 @@ public void TestParseBpmFromChartSections() } [Test] - public void TestParseNotesFromChartSections() + public void TestParseNotesFromChartSection() { var sections = Parsers.ParseSectionsFromChart(Mocks.SONG_CHART); @@ -78,7 +78,7 @@ public void TestParseNotesFromChartSections() } [Test] - public void TestParseLyricsFromChartSections() + public void TestParseLyricsFromChartSection() { var sections = Parsers.ParseSectionsFromChart(Mocks.SONG_CHART); diff --git a/UnityPackage/README.md b/UnityPackage/README.md index aba9cea..a000390 100644 --- a/UnityPackage/README.md +++ b/UnityPackage/README.md @@ -213,7 +213,8 @@ int main() auto sections = ParseSectionsFromChart(content.c_str()); - auto metaData = ParseMetaDataFromChartSections(sections); + auto metaData = ParseMetaDataFromChartSection( + sections.at(ToString(NamedSection::Song))); std::cout << metaData["Name"] << std::endl; // Example Song std::cout << metaData["Resolution"] << std::endl; // 192 @@ -255,7 +256,8 @@ int main() auto sections = ParseSectionsFromChart(content.c_str()); - auto timeSignatures = ParseTimeSignaturesFromChartSections(sections); + auto timeSignatures = ParseTimeSignaturesFromChartSection( + sections.at(ToString(NamedSection::SyncTrack))); std::cout << size(timeSignatures) << std::endl; // 4 @@ -295,7 +297,8 @@ int main() auto sections = ParseSectionsFromChart(content.c_str()); - auto bpm = ParseBpmFromChartSections(sections); + auto bpm = ParseBpmFromChartSection( + sections.at(ToString(NamedSection::SyncTrack))); std::cout << size(bpm) << std::endl; // 7 @@ -335,7 +338,8 @@ int main() auto sections = ParseSectionsFromChart(content.c_str()); - auto notes = ParseNotesFromChartSections(sections, Expert); + auto notes = ParseNotesFromChartSection( + sections.at(ToString(Difficulty::Expert) + "Single")); for (auto ¬e : notes) { @@ -383,7 +387,8 @@ int main() auto sections = ParseSectionsFromChart(content.c_str()); - auto lyrics = ParseLyricsFromChartSections(sections); + auto lyrics = ParseLyricsFromChartSection( + sections.at(ToString(NamedSection::Events))); std::cout << size(lyrics) << std::endl; // 12 diff --git a/includes/RhythmGameUtilities/Parsers.hpp b/includes/RhythmGameUtilities/Parsers.hpp index 7c1bfbc..b7094d5 100644 --- a/includes/RhythmGameUtilities/Parsers.hpp +++ b/includes/RhythmGameUtilities/Parsers.hpp @@ -38,12 +38,6 @@ typedef struct int lineCount; } ChartSectionInternal; -typedef struct -{ - std::string name; - std::vector>> lines; -} ChartSection; - std::regex CHART_SECTION_PATTERN("\\[([a-z]+)\\]\\s*\\{([^\\}]+)\\}", std::regex_constants::icase); @@ -51,11 +45,15 @@ std::regex CHART_SECTION_LINE_PATTERN("([^=]+)\\s*=([^\\r\\n]+)"); std::regex JSON_VALUE_PATTERN("(\"[^\"]+\"|\\S+)"); -std::vector ParseSectionsFromChart(const char *contents) +std::map>>> +ParseSectionsFromChart(const char *contents) { auto matches = FindAllMatches(contents, CHART_SECTION_PATTERN); - auto sections = std::vector(); + std::map>>> + sections; for (auto i = 0; i < matches.size(); i += 1) { @@ -66,15 +64,10 @@ std::vector ParseSectionsFromChart(const char *contents) continue; } - ChartSection section; - - section.name = parts[1].c_str(); - auto lines = FindAllMatches(parts[2].c_str(), CHART_SECTION_LINE_PATTERN); - section.lines = - std::vector>>(); + std::vector>> items; for (auto j = 0; j < lines.size(); j += 1) { @@ -91,21 +84,21 @@ std::vector ParseSectionsFromChart(const char *contents) std::regex_replace(values[k], std::regex("^\"|\"$"), ""); } - section.lines.push_back(std::make_pair(key, values)); + items.push_back(std::make_pair(key, values)); } - sections.push_back(section); + sections.insert({parts[1].c_str(), items}); } return sections; } -std::map -ParseMetaDataFromChartSection(ChartSection section) +std::map ParseMetaDataFromChartSection( + std::vector>> section) { auto data = std::map(); - for (auto &line : section.lines) + for (auto &line : section) { data.insert({line.first, line.second.front()}); } @@ -113,25 +106,12 @@ ParseMetaDataFromChartSection(ChartSection section) return data; } -std::map -ParseMetaDataFromChartSections(std::vector sections) -{ - for (auto §ion : sections) - { - if (section.name == ToString(NamedSection::Song)) - { - return ParseMetaDataFromChartSection(section); - } - } - - return std::map(); -} - -std::map ParseTimeSignaturesFromChartSection(ChartSection section) +std::map ParseTimeSignaturesFromChartSection( + std::vector>> section) { auto timeSignatures = std::map(); - for (auto &line : section.lines) + for (auto &line : section) { if (line.second.front() == ToString(TypeCode::TimeSignatureMarker)) { @@ -143,25 +123,12 @@ std::map ParseTimeSignaturesFromChartSection(ChartSection section) return timeSignatures; } -std::map -ParseTimeSignaturesFromChartSections(std::vector sections) -{ - for (auto §ion : sections) - { - if (section.name == ToString(NamedSection::SyncTrack)) - { - return ParseTimeSignaturesFromChartSection(section); - } - } - - return std::map(); -} - -std::map ParseBpmFromChartSection(ChartSection section) +std::map ParseBpmFromChartSection( + std::vector>> section) { auto bpm = std::map(); - for (auto &line : section.lines) + for (auto &line : section) { if (line.second.front() == ToString(TypeCode::BPM_Marker)) { @@ -172,24 +139,12 @@ std::map ParseBpmFromChartSection(ChartSection section) return bpm; } -std::map ParseBpmFromChartSections(std::vector sections) -{ - for (auto §ion : sections) - { - if (section.name == ToString(NamedSection::SyncTrack)) - { - return ParseBpmFromChartSection(section); - } - } - - return std::map(); -} - -std::vector ParseNotesFromChartSection(ChartSection section) +std::vector ParseNotesFromChartSection( + std::vector>> section) { auto notes = std::vector(); - for (auto &line : section.lines) + for (auto &line : section) { if (line.second.front() == ToString(TypeCode::NoteMarker)) { @@ -202,26 +157,12 @@ std::vector ParseNotesFromChartSection(ChartSection section) return notes; } -std::vector -ParseNotesFromChartSections(std::vector sections, - Difficulty difficulty) -{ - for (auto §ion : sections) - { - if (section.name == ToString(difficulty) + "Single") - { - return ParseNotesFromChartSection(section); - } - } - - return std::vector(); -} - -std::map ParseLyricsFromChartSection(ChartSection section) +std::map ParseLyricsFromChartSection( + std::vector>> section) { auto lyrics = std::map(); - for (auto &line : section.lines) + for (auto &line : section) { if (line.second.back().rfind("lyric", 0) == 0) { @@ -232,18 +173,4 @@ std::map ParseLyricsFromChartSection(ChartSection section) return lyrics; } -std::map -ParseLyricsFromChartSections(std::vector sections) -{ - for (auto §ion : sections) - { - if (section.name == ToString(NamedSection::Events)) - { - return ParseLyricsFromChartSection(section); - } - } - - return std::map(); -} - } // namespace RhythmGameUtilities diff --git a/includes/RhythmGameUtilities/ParsersInternal.hpp b/includes/RhythmGameUtilities/ParsersInternal.hpp index 2122a91..dcac440 100644 --- a/includes/RhythmGameUtilities/ParsersInternal.hpp +++ b/includes/RhythmGameUtilities/ParsersInternal.hpp @@ -25,30 +25,30 @@ extern "C" auto sections = (ChartSectionInternal *)malloc( internalSections.size() * sizeof(ChartSectionInternal)); - for (auto i = 0; i < internalSections.size(); i += 1) + int i = 0; + + for (auto section = internalSections.begin(); + section != internalSections.end(); section++) { - auto nameLength = internalSections[i].name.size() + 1; + auto nameLength = section->first.size() + 1; sections[i].name = (char *)malloc(nameLength); - strncpy(sections[i].name, internalSections[i].name.c_str(), - nameLength - 1); + strncpy(sections[i].name, section->first.c_str(), nameLength - 1); sections[i].name[nameLength - 1] = '\0'; sections[i].lines = (KeyValuePairInternal *)malloc( - internalSections[i].lines.size() * - sizeof(KeyValuePairInternal)); + section->second.size() * sizeof(KeyValuePairInternal)); - sections[i].lineCount = internalSections[i].lines.size(); + sections[i].lineCount = section->second.size(); - for (auto j = 0; j < internalSections[i].lines.size(); j += 1) + for (auto j = 0; j < section->second.size(); j += 1) { - auto keyLength = internalSections[i].lines[j].first.size() + 1; + auto keyLength = section->second[j].first.size() + 1; sections[i].lines[j].key = (char *)malloc(keyLength); strncpy(sections[i].lines[j].key, - internalSections[i].lines[j].first.c_str(), - keyLength - 1); + section->second[j].first.c_str(), keyLength - 1); sections[i].lines[j].key[keyLength - 1] = '\0'; - auto values = internalSections[i].lines[j].second; + auto values = section->second[j].second; for (auto k = 0; k < values.size(); k += 1) { @@ -62,6 +62,8 @@ extern "C" sections[i].lines[j].valueCount = values.size(); } + + i += 1; } return sections; diff --git a/tests/RhythmGameUtilities/Parsers.cpp b/tests/RhythmGameUtilities/Parsers.cpp index 53fb047..da0e6f8 100644 --- a/tests/RhythmGameUtilities/Parsers.cpp +++ b/tests/RhythmGameUtilities/Parsers.cpp @@ -75,40 +75,40 @@ void testParseSectionsFromChart() assert(sections.size() == 4); - assert(sections.at(0).name == "Song"); - assert(sections.at(1).name == "SyncTrack"); - assert(sections.at(2).name == "Events"); - assert(sections.at(3).name == "ExpertSingle"); + assert(sections.find(ToString(NamedSection::Song)) != sections.end()); + assert(sections.find(ToString(NamedSection::SyncTrack)) != sections.end()); + assert(sections.find(ToString(Difficulty::Expert) + "Single") != + sections.end()); std::cout << "."; } -void testParseValuesFromChartSections() +void testParseValuesFromChartSection() { auto sections = ParseSectionsFromChart(contents); - assert(sections.size() == 4); + auto values = sections.at(ToString(NamedSection::Song)); - assert(sections.at(0).name == "Song"); - assert(sections.at(0).lines.size() == 12); + assert(values.size() == 12); - assert(sections.at(0).lines[0].first == "Name"); - assert(sections.at(0).lines[0].second[0] == "Example Song"); + assert(values[0].first == "Name"); + assert(values[0].second[0] == "Example Song"); - assert(sections.at(0).lines[6].first == "Resolution"); - assert(sections.at(0).lines[6].second[0] == "192"); + assert(values[6].first == "Resolution"); + assert(values[6].second[0] == "192"); - assert(sections.at(0).lines[11].first == "MusicStream"); - assert(sections.at(0).lines[11].second[0] == "Example Song.ogg"); + assert(values[11].first == "MusicStream"); + assert(values[11].second[0] == "Example Song.ogg"); std::cout << "."; } -void testParseMetaDataFromChartSections() +void testParseMetaDataFromChartSection() { auto sections = ParseSectionsFromChart(contents); - auto lines = ParseMetaDataFromChartSections(sections); + auto lines = ParseMetaDataFromChartSection( + sections.at(ToString(NamedSection::Song))); assert(lines.size() == 12); @@ -119,44 +119,48 @@ void testParseMetaDataFromChartSections() std::cout << "."; } -void testParseTimeSignaturesFromChartSections() +void testParseTimeSignaturesFromChartSection() { auto sections = ParseSectionsFromChart(contents); - auto lines = ParseTimeSignaturesFromChartSections(sections); + auto lines = ParseTimeSignaturesFromChartSection( + sections.at(ToString(NamedSection::SyncTrack))); assert(lines.size() == 4); std::cout << "."; } -void testParseBpmFromChartSections() +void testParseBpmFromChartSection() { auto sections = ParseSectionsFromChart(contents); - auto lines = ParseBpmFromChartSections(sections); + auto lines = ParseBpmFromChartSection( + sections.at(ToString(NamedSection::SyncTrack))); assert(lines.size() == 7); std::cout << "."; } -void testParseNotesFromChartSections() +void testParseNotesFromChartSection() { auto sections = ParseSectionsFromChart(contents); - auto lines = ParseNotesFromChartSections(sections, Difficulty::Expert); + auto lines = ParseNotesFromChartSection( + sections.at(ToString(Difficulty::Expert) + "Single")); assert(lines.size() == 8); std::cout << "."; } -void testParseLyricsFromChartSections() +void testParseLyricsFromChartSection() { auto sections = ParseSectionsFromChart(contents); - auto lines = ParseLyricsFromChartSections(sections); + auto lines = ParseLyricsFromChartSection( + sections.at(ToString(NamedSection::Events))); assert(lines.size() == 12); @@ -166,13 +170,13 @@ void testParseLyricsFromChartSections() int main() { testParseSectionsFromChart(); - testParseValuesFromChartSections(); + testParseValuesFromChartSection(); - testParseMetaDataFromChartSections(); - testParseTimeSignaturesFromChartSections(); - testParseBpmFromChartSections(); - testParseNotesFromChartSections(); - testParseLyricsFromChartSections(); + testParseMetaDataFromChartSection(); + testParseTimeSignaturesFromChartSection(); + testParseBpmFromChartSection(); + testParseNotesFromChartSection(); + testParseLyricsFromChartSection(); return 0; } diff --git a/tests/RhythmGameUtilities/ParsersInternal.cpp b/tests/RhythmGameUtilities/ParsersInternal.cpp index c53b356..55dbcdd 100644 --- a/tests/RhythmGameUtilities/ParsersInternal.cpp +++ b/tests/RhythmGameUtilities/ParsersInternal.cpp @@ -69,6 +69,20 @@ auto contents = R"([Song] 1248 = E soloend })"; +ChartSectionInternal *FindSection(ChartSectionInternal *sections, int size, + std::string name) +{ + for (auto i = 0; i < size; i += 1) + { + if (sections[i].name == name) + { + return §ions[i]; + } + } + + return nullptr; +} + void testParseSectionsFromChartInternal() { int size = 0; @@ -77,19 +91,29 @@ void testParseSectionsFromChartInternal() assert(size == 4); - assert(strcmp(sections[0].name, "Song") == 0); - assert(sections[0].lineCount == 12); - assert(strcmp(sections[1].name, "SyncTrack") == 0); - assert(sections[1].lineCount == 11); - assert(strcmp(sections[2].name, "Events") == 0); - assert(sections[2].lineCount == 16); - assert(strcmp(sections[3].name, "ExpertSingle") == 0); - assert(sections[3].lineCount == 11); + auto song = FindSection(sections, size, ToString(NamedSection::Song)); + + auto syncTrack = + FindSection(sections, size, ToString(NamedSection::SyncTrack)); + + auto events = FindSection(sections, size, ToString(NamedSection::Events)); + + auto expertSingle = + FindSection(sections, size, ToString(Difficulty::Expert) + "Single"); + + assert(song != nullptr); + assert(song->lineCount == 12); + assert(syncTrack != nullptr); + assert(syncTrack->lineCount == 11); + assert(events != nullptr); + assert(events->lineCount == 16); + assert(expertSingle != nullptr); + assert(expertSingle->lineCount == 11); std::cout << "."; } -void testParseValuesFromChartSectionsInternal() +void testParseValuesFromChartSectionInternal() { int size = 0; @@ -97,16 +121,18 @@ void testParseValuesFromChartSectionsInternal() assert(size == 4); - assert(sections[0].lineCount == 12); + auto song = FindSection(sections, size, ToString(NamedSection::Song)); + + assert(song->lineCount == 12); - assert(strcmp(sections[0].lines[0].key, "Name") == 0); - assert(strcmp(sections[0].lines[0].values[0], "Example Song") == 0); + assert(strcmp(song->lines[0].key, "Name") == 0); + assert(strcmp(song->lines[0].values[0], "Example Song") == 0); - assert(strcmp(sections[0].lines[6].key, "Resolution") == 0); - assert(strcmp(sections[0].lines[6].values[0], "192") == 0); + assert(strcmp(song->lines[6].key, "Resolution") == 0); + assert(strcmp(song->lines[6].values[0], "192") == 0); - assert(strcmp(sections[0].lines[11].key, "MusicStream") == 0); - assert(strcmp(sections[0].lines[11].values[0], "Example Song.ogg") == 0); + assert(strcmp(song->lines[11].key, "MusicStream") == 0); + assert(strcmp(song->lines[11].values[0], "Example Song.ogg") == 0); std::cout << "."; } @@ -114,7 +140,7 @@ void testParseValuesFromChartSectionsInternal() int main() { testParseSectionsFromChartInternal(); - testParseValuesFromChartSectionsInternal(); + testParseValuesFromChartSectionInternal(); return 0; }