Make SceneParser a subclass of ScalarMappingParser
This commit is contained in:
parent
325e9459fd
commit
693e4fa80d
2 changed files with 33 additions and 44 deletions
|
@ -17,7 +17,7 @@ namespace yaml {
|
||||||
|
|
||||||
SceneParser::SceneParser(Scene& scene,
|
SceneParser::SceneParser(Scene& scene,
|
||||||
ParserStack& parsers)
|
ParserStack& parsers)
|
||||||
: Parser(scene, parsers),
|
: ScalarMappingParser(scene, parsers),
|
||||||
mSection(SceneParser::NoSection)
|
mSection(SceneParser::NoSection)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
|
@ -27,12 +27,25 @@ SceneParser::~SceneParser()
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
SceneParser::HandleEvent(yaml_event_t& event)
|
SceneParser::HandleKeyEvent(const std::string& key)
|
||||||
|
{
|
||||||
|
static const std::map<std::string, Section> sSections = {
|
||||||
|
{"dimensions", DimensionsSection},
|
||||||
|
};
|
||||||
|
|
||||||
|
if (sSections.count(key) > 0) {
|
||||||
|
mSection = sSections.at(key);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
mSection = NoSection;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
SceneParser::HandleValueEvent(yaml_event_t& event)
|
||||||
{
|
{
|
||||||
switch (mSection) {
|
switch (mSection) {
|
||||||
case NoSection:
|
|
||||||
HandleTopLevelEvent(event);
|
|
||||||
break;
|
|
||||||
case CameraSection:
|
case CameraSection:
|
||||||
break;
|
break;
|
||||||
case DimensionsSection:
|
case DimensionsSection:
|
||||||
|
@ -45,40 +58,8 @@ SceneParser::HandleEvent(yaml_event_t& event)
|
||||||
assert(false);
|
assert(false);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
SetShouldExpectKey(false);
|
||||||
void
|
|
||||||
SceneParser::HandleTopLevelEvent(yaml_event_t& event)
|
|
||||||
{
|
|
||||||
static const std::string CAMERA = "camera";
|
|
||||||
static const std::string DIMENSIONS = "dimensions";
|
|
||||||
static const std::string OBJECTS = "objects";
|
|
||||||
|
|
||||||
if (event.type == YAML_MAPPING_END_EVENT) {
|
|
||||||
SetDone(true);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (event.type != YAML_SCALAR_EVENT) {
|
|
||||||
/* TODO: Invalid event type for top-level Scene. Fail. */
|
|
||||||
abort();
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string key = (char *)event.data.scalar.value;
|
|
||||||
if (key == CAMERA) {
|
|
||||||
mSection = SceneParser::CameraSection;
|
|
||||||
}
|
|
||||||
else if (key == DIMENSIONS) {
|
|
||||||
mSection = SceneParser::DimensionsSection;
|
|
||||||
}
|
|
||||||
else if (key == OBJECTS) {
|
|
||||||
mSection = SceneParser::ObjectsSection;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
/* TODO: Invalid key. Fail. */
|
|
||||||
abort();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -94,6 +75,7 @@ SceneParser::HandleDimensionsEvent(yaml_event_t& event)
|
||||||
sc.set_height(dimensions.at(1));
|
sc.set_height(dimensions.at(1));
|
||||||
|
|
||||||
mSection = NoSection;
|
mSection = NoSection;
|
||||||
|
SetShouldExpectKey(true);
|
||||||
};
|
};
|
||||||
|
|
||||||
switch (event.type) {
|
switch (event.type) {
|
||||||
|
|
|
@ -9,28 +9,35 @@
|
||||||
#ifndef __YAML_SCENE_PARSER_HH__
|
#ifndef __YAML_SCENE_PARSER_HH__
|
||||||
#define __YAML_SCENE_PARSER_HH__
|
#define __YAML_SCENE_PARSER_HH__
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
#include "parsers.hh"
|
#include "parsers.hh"
|
||||||
|
#include "scalarMappingParser.hh"
|
||||||
|
|
||||||
|
|
||||||
namespace yaml {
|
namespace yaml {
|
||||||
|
|
||||||
struct SceneParser
|
struct SceneParser
|
||||||
: public Parser
|
: public ScalarMappingParser
|
||||||
{
|
{
|
||||||
SceneParser(Scene& scene, ParserStack& parsers);
|
SceneParser(Scene& scene, ParserStack& parsers);
|
||||||
~SceneParser();
|
~SceneParser();
|
||||||
|
|
||||||
void HandleEvent(yaml_event_t& event);
|
protected:
|
||||||
void HandleTopLevelEvent(yaml_event_t& event);
|
void HandleKeyEvent(const std::string& key);
|
||||||
void HandleDimensionsEvent(yaml_event_t& event);
|
void HandleValueEvent(yaml_event_t& event);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
enum {
|
enum Section {
|
||||||
NoSection,
|
NoSection,
|
||||||
CameraSection,
|
CameraSection,
|
||||||
DimensionsSection,
|
DimensionsSection,
|
||||||
ObjectsSection,
|
ObjectsSection,
|
||||||
} mSection;
|
};
|
||||||
|
|
||||||
|
void HandleDimensionsEvent(yaml_event_t& event);
|
||||||
|
|
||||||
|
Section mSection;
|
||||||
};
|
};
|
||||||
|
|
||||||
} /* namespace yaml */
|
} /* namespace yaml */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue