Guest User

yaml-cpp example

a guest
May 25th, 2010
2,585
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.25 KB | None | 0 0
  1. #include "yaml.h"
  2. #include <iostream>
  3. #include <fstream>
  4. #include <string>
  5. #include <vector>    
  6.    
  7. // our data models
  8. struct Vec3
  9. {  
  10.    float x, y, z;
  11. };  
  12.  
  13. struct Power
  14. {
  15.    std::string name;
  16.    int damage;
  17. }; struct Monster {   std::string name;   Vec3 position;
  18.    std::vector <Power> powers;
  19. };  
  20.    
  21. // operators for parsing
  22. void operator >> (const YAML::Node& node, Vec3& v)
  23. {  
  24.    node[0] >> v.x;
  25.    node[1] >> v.y;
  26.    node[2] >> v.z;
  27. }
  28.    
  29. void operator >> (const YAML::Node& node, Power& power)
  30. {  
  31.    node["name"] >> power.name;
  32.    node["damage"] >> power.damage;
  33. }  
  34.    
  35. void operator >> (const YAML::Node& node, Monster& monster)
  36. {      
  37.     node["name"] >> monster.name;
  38.     node["position"] >> monster.position;
  39.     const YAML::Node& powers = node["powers"];
  40.     for(unsigned i = 0; i < powers.size(); i++)
  41.     {
  42.         Power power;
  43.         powers[i] >> power;
  44.         monster.powers.push_back(power);
  45.     }  
  46. }  
  47.    
  48. // operators for emitting
  49. YAML::Emitter& operator << (YAML::Emitter& out, const Vec3& v)
  50. {  
  51.     out << YAML::Flow;
  52.     out << YAML::BeginSeq << v.x << v.y << v.z << YAML::EndSeq;
  53.     return out;
  54. }
  55.  
  56. YAML::Emitter& operator << (YAML::Emitter& out, const Power& power)
  57. {
  58.     out << YAML::BeginMap;
  59.     out << YAML::Key << "name";
  60.     out << YAML::Value << power.name;
  61.     out << YAML::Key << "damage";
  62.     out << YAML::Value << power.damage;
  63.     out << YAML::EndMap;
  64.     return out;
  65. }
  66.  
  67. YAML::Emitter& operator << (YAML::Emitter& out, const Monster& monster)
  68. {
  69.     out << YAML::BeginMap;
  70.     out << YAML::Key << "name";
  71.     out << YAML::Value << monster.name;
  72.     out << YAML::Key << "position";
  73.     out << YAML::Value << monster.position;
  74.     out << YAML::Key << "powers";
  75.     out << YAML::Value;
  76.     out << YAML::BeginSeq;
  77.     for(size_t pidx = 0; pidx < monster.powers.size(); ++pidx)
  78.     {
  79.         out << monster.powers[pidx];
  80.     }
  81.     out << YAML::EndSeq;
  82.     out << YAML::EndMap;
  83.     return out;
  84. }
  85.  
  86.  
  87. int main()
  88. {
  89.    std::string monsters_yaml("- name: Ogre\n  position: [0, 5, 0]\n  powers:\n    - name: Club\n      damage: 10\n    - name: Fist\n      damage: 8\n- name: Dragon\n  position: [1, 0, 10]\n  powers:\n    - name: Fire Breath\n      damage: 25\n    - name: Claws\n      damage: 15\n- name: Wizard\n  position: [5, -3, 0]\n  powers:\n    - name: Acid Rain\n      damage: 50\n    - name: Staff\n      damage: 3\n");
  90.  
  91.     // list of monsters
  92.     std::vector<Monster> monsters;
  93.  
  94.     // write out the monster.yaml
  95.     std::ofstream monsters_yaml_file;
  96.     monsters_yaml_file.open("monsters.yaml");
  97.     monsters_yaml_file << monsters_yaml;
  98.     monsters_yaml_file.close();
  99.  
  100.     // read in the the monster.yaml
  101.     std::ifstream fin("monsters.yaml");
  102.     YAML::Parser parser(fin);
  103.     YAML::Node doc;
  104.     parser.GetNextDocument(doc);
  105.     for(size_t i = 0; i < doc.size(); i++)
  106.     {
  107.         Monster monster;
  108.         doc[i] >> monster;
  109.         monsters.push_back(monster);
  110.         std::cout << monster.name << std::endl;
  111.     }
  112.  
  113.     YAML::Emitter out;
  114.     out << YAML::BeginSeq;
  115.     for(size_t i = 0; i < monsters.size(); i++)
  116.     {
  117.         out << monsters[i];
  118.     }
  119.     out << YAML::EndSeq;
  120.  
  121.     std::cout << out.c_str() << std::endl;
  122.     return 0;
  123. }
Advertisement
Add Comment
Please, Sign In to add comment