#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <boost/variant.hpp>
#include <boost/optional.hpp>
using string = std::string;
namespace cppmodel {
struct Class;
using Type = boost::variant<Class*,string>;
struct Var{
string name, value;
Type type;
bool is_volatile = false;
bool is_mutable = false;
bool is_const = false;
bool is_static = false;
bool is_ref = false;
std::uint8_t is_pointer = 0; // 0 false, otherwise pointer depth in *
std::uint8_t has_bits = 0;//bits
};
using BasicArgumentList = std::vector<Var>;
struct Using
{
string aliasname,aliastype;
boost::optional<BasicArgumentList> arguments;
};
struct Function{
string name,test,body,comment;
std::vector<Type> arguments;
Type rtype = "void";
boost::optional<BasicArgumentList> template_arguments;
bool isTemplate()const {return template_arguments.is_initialized() && !template_arguments.get().empty();}
bool is_noexcept = true;
bool is_inline = false;
bool is_static = false;
};
struct Default{};
struct Delete{};
using default_or_delete = boost::optional<boost::variant<Default,Delete>>;
struct Ref{};
struct RefRef{};
using RefQualifier = boost::optional<boost::variant<Ref,RefRef> >;
struct Method{
string name,test,body,comment;
std::vector<Type> arguments;
Type rtype = "void";
bool is_virtual = false, is_pure_virtual = false, is_const = false;
boost::optional<BasicArgumentList> template_arguments;
default_or_delete dod;
RefQualifier refqualifier;
bool is_noexcept = true;
bool is_inline = false;
bool is_static = false;
bool is_override = false;
};
struct Constructor{
string test,body;
std::vector<Type> arguments;
Class& type;
boost::optional<BasicArgumentList> template_arguments;
default_or_delete dod;
bool is_noexcept = true;
};
struct Private{};
struct Public{};
struct Protected{};
using Access = boost::variant<Private,Public,Protected>;
struct Destructor{
string test,body;
Class& type;
Access access;
default_or_delete dod;
bool is_virtual = false;
bool is_inline = false;
bool is_friend = false;
};
struct Parent
{
Type type;
Access access;
bool is_virtual;
};
using ClassMembers = boost::variant<Class*, Var,Function,Method,Constructor,Using>;
struct Class
{
string test,name,comment;
boost::optional<Destructor> destructor;
std::multimap<Access,ClassMembers> members;
std::vector<Parent> parents;
boost::optional<BasicArgumentList> template_arguments;
bool isTemplate()const{return template_arguments.is_initialized() && !template_arguments.get().empty();}
bool is_final = false;
bool is_class = false;
bool is_noexcept = true;
};
class Namespace;
using NamespaceMembers = boost::variant<string,Namespace*, Var, Function, Class,Using>;
struct Namespace{
string name;
std::vector<NamespaceMembers> members;
};
}
int main(int argc, char *argv[])
{
using namespace cppmodel;
Namespace root{"cppmodel",{}};
auto& members = root.members;
members.push_back("struct Class;");
Using type{"type","boost::variant<Class*,string>",{}};
members.push_back(type);
std::cout << "Hello World!" << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8bWFwPgoKI2luY2x1ZGUgPGJvb3N0L3ZhcmlhbnQuaHBwPgojaW5jbHVkZSA8Ym9vc3Qvb3B0aW9uYWwuaHBwPgoKdXNpbmcgc3RyaW5nID0gc3RkOjpzdHJpbmc7CgpuYW1lc3BhY2UgY3BwbW9kZWwgewoKCnN0cnVjdCBDbGFzczsKdXNpbmcgVHlwZSA9IGJvb3N0Ojp2YXJpYW50PENsYXNzKixzdHJpbmc+OwoKc3RydWN0IFZhcnsKICAgIHN0cmluZyBuYW1lLCB2YWx1ZTsKICAgIFR5cGUgdHlwZTsKICAgIGJvb2wgaXNfdm9sYXRpbGUgPSBmYWxzZTsKICAgIGJvb2wgaXNfbXV0YWJsZSA9IGZhbHNlOwogICAgYm9vbCBpc19jb25zdCA9IGZhbHNlOwogICAgYm9vbCBpc19zdGF0aWMgPSBmYWxzZTsKICAgIGJvb2wgaXNfcmVmID0gZmFsc2U7CiAgICBzdGQ6OnVpbnQ4X3QgaXNfcG9pbnRlciA9IDA7IC8vIDAgZmFsc2UsIG90aGVyd2lzZSBwb2ludGVyIGRlcHRoIGluICoKICAgIHN0ZDo6dWludDhfdCBoYXNfYml0cyA9IDA7Ly9iaXRzCn07Cgp1c2luZyBCYXNpY0FyZ3VtZW50TGlzdCA9IHN0ZDo6dmVjdG9yPFZhcj47CgpzdHJ1Y3QgVXNpbmcKewogICAgc3RyaW5nIGFsaWFzbmFtZSxhbGlhc3R5cGU7CiAgICBib29zdDo6b3B0aW9uYWw8QmFzaWNBcmd1bWVudExpc3Q+IGFyZ3VtZW50czsKfTsKCnN0cnVjdCBGdW5jdGlvbnsKICAgIHN0cmluZyBuYW1lLHRlc3QsYm9keSxjb21tZW50OwogICAgc3RkOjp2ZWN0b3I8VHlwZT4gYXJndW1lbnRzOwogICAgVHlwZSBydHlwZSA9ICJ2b2lkIjsKICAgIGJvb3N0OjpvcHRpb25hbDxCYXNpY0FyZ3VtZW50TGlzdD4gdGVtcGxhdGVfYXJndW1lbnRzOwogICAgYm9vbCBpc1RlbXBsYXRlKCljb25zdCB7cmV0dXJuIHRlbXBsYXRlX2FyZ3VtZW50cy5pc19pbml0aWFsaXplZCgpICYmICF0ZW1wbGF0ZV9hcmd1bWVudHMuZ2V0KCkuZW1wdHkoKTt9CiAgICBib29sIGlzX25vZXhjZXB0ID0gdHJ1ZTsKICAgIGJvb2wgaXNfaW5saW5lID0gZmFsc2U7CiAgICBib29sIGlzX3N0YXRpYyA9IGZhbHNlOwp9OwoKc3RydWN0IERlZmF1bHR7fTsKc3RydWN0IERlbGV0ZXt9Owp1c2luZyBkZWZhdWx0X29yX2RlbGV0ZSA9IGJvb3N0OjpvcHRpb25hbDxib29zdDo6dmFyaWFudDxEZWZhdWx0LERlbGV0ZT4+OwoKc3RydWN0IFJlZnt9OwpzdHJ1Y3QgUmVmUmVme307CnVzaW5nIFJlZlF1YWxpZmllciA9IGJvb3N0OjpvcHRpb25hbDxib29zdDo6dmFyaWFudDxSZWYsUmVmUmVmPiA+OwoKc3RydWN0IE1ldGhvZHsKICAgIHN0cmluZyBuYW1lLHRlc3QsYm9keSxjb21tZW50OwogICAgc3RkOjp2ZWN0b3I8VHlwZT4gYXJndW1lbnRzOwogICAgVHlwZSBydHlwZSA9ICJ2b2lkIjsKICAgIGJvb2wgaXNfdmlydHVhbCA9IGZhbHNlLCBpc19wdXJlX3ZpcnR1YWwgPSBmYWxzZSwgaXNfY29uc3QgPSBmYWxzZTsKICAgIGJvb3N0OjpvcHRpb25hbDxCYXNpY0FyZ3VtZW50TGlzdD4gdGVtcGxhdGVfYXJndW1lbnRzOwogICAgZGVmYXVsdF9vcl9kZWxldGUgZG9kOwogICAgUmVmUXVhbGlmaWVyIHJlZnF1YWxpZmllcjsKICAgIGJvb2wgaXNfbm9leGNlcHQgPSB0cnVlOwogICAgYm9vbCBpc19pbmxpbmUgPSBmYWxzZTsKICAgIGJvb2wgaXNfc3RhdGljID0gZmFsc2U7CiAgICBib29sIGlzX292ZXJyaWRlID0gZmFsc2U7Cn07CgpzdHJ1Y3QgQ29uc3RydWN0b3J7CiAgICBzdHJpbmcgdGVzdCxib2R5OwogICAgc3RkOjp2ZWN0b3I8VHlwZT4gYXJndW1lbnRzOwogICAgQ2xhc3MmIHR5cGU7CiAgICBib29zdDo6b3B0aW9uYWw8QmFzaWNBcmd1bWVudExpc3Q+IHRlbXBsYXRlX2FyZ3VtZW50czsKICAgIGRlZmF1bHRfb3JfZGVsZXRlIGRvZDsKICAgIGJvb2wgaXNfbm9leGNlcHQgPSB0cnVlOwp9OwoKc3RydWN0IFByaXZhdGV7fTsKc3RydWN0IFB1YmxpY3t9OwpzdHJ1Y3QgUHJvdGVjdGVke307Cgp1c2luZyBBY2Nlc3MgPSBib29zdDo6dmFyaWFudDxQcml2YXRlLFB1YmxpYyxQcm90ZWN0ZWQ+OwoKc3RydWN0IERlc3RydWN0b3J7CiAgICBzdHJpbmcgdGVzdCxib2R5OwogICAgQ2xhc3MmIHR5cGU7CiAgICBBY2Nlc3MgYWNjZXNzOwogICAgZGVmYXVsdF9vcl9kZWxldGUgZG9kOwogICAgYm9vbCBpc192aXJ0dWFsID0gZmFsc2U7CiAgICBib29sIGlzX2lubGluZSA9IGZhbHNlOwogICAgYm9vbCBpc19mcmllbmQgPSBmYWxzZTsKfTsKCnN0cnVjdCBQYXJlbnQKewogICAgVHlwZSB0eXBlOwogICAgQWNjZXNzIGFjY2VzczsKICAgIGJvb2wgaXNfdmlydHVhbDsKfTsKCnVzaW5nIENsYXNzTWVtYmVycyA9IGJvb3N0Ojp2YXJpYW50PENsYXNzKiwgVmFyLEZ1bmN0aW9uLE1ldGhvZCxDb25zdHJ1Y3RvcixVc2luZz47CgpzdHJ1Y3QgQ2xhc3MKewogICAgc3RyaW5nIHRlc3QsbmFtZSxjb21tZW50OwogICAgYm9vc3Q6Om9wdGlvbmFsPERlc3RydWN0b3I+IGRlc3RydWN0b3I7CiAgICBzdGQ6Om11bHRpbWFwPEFjY2VzcyxDbGFzc01lbWJlcnM+IG1lbWJlcnM7CiAgICBzdGQ6OnZlY3RvcjxQYXJlbnQ+IHBhcmVudHM7CiAgICBib29zdDo6b3B0aW9uYWw8QmFzaWNBcmd1bWVudExpc3Q+IHRlbXBsYXRlX2FyZ3VtZW50czsKICAgIGJvb2wgaXNUZW1wbGF0ZSgpY29uc3R7cmV0dXJuIHRlbXBsYXRlX2FyZ3VtZW50cy5pc19pbml0aWFsaXplZCgpICYmICF0ZW1wbGF0ZV9hcmd1bWVudHMuZ2V0KCkuZW1wdHkoKTt9CiAgICBib29sIGlzX2ZpbmFsID0gZmFsc2U7CiAgICBib29sIGlzX2NsYXNzID0gZmFsc2U7CiAgICBib29sIGlzX25vZXhjZXB0ID0gdHJ1ZTsKfTsKCmNsYXNzIE5hbWVzcGFjZTsKdXNpbmcgTmFtZXNwYWNlTWVtYmVycyA9IGJvb3N0Ojp2YXJpYW50PHN0cmluZyxOYW1lc3BhY2UqLCBWYXIsIEZ1bmN0aW9uLCBDbGFzcyxVc2luZz47CgpzdHJ1Y3QgTmFtZXNwYWNlewogICAgc3RyaW5nIG5hbWU7CiAgICBzdGQ6OnZlY3RvcjxOYW1lc3BhY2VNZW1iZXJzPiBtZW1iZXJzOwp9OwoKfQoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKewogICAgdXNpbmcgbmFtZXNwYWNlIGNwcG1vZGVsOwogICAgTmFtZXNwYWNlIHJvb3R7ImNwcG1vZGVsIix7fX07CiAgICBhdXRvJiBtZW1iZXJzID0gcm9vdC5tZW1iZXJzOwogICAgbWVtYmVycy5wdXNoX2JhY2soInN0cnVjdCBDbGFzczsiKTsKICAgIFVzaW5nIHR5cGV7InR5cGUiLCJib29zdDo6dmFyaWFudDxDbGFzcyosc3RyaW5nPiIse319OwogICAgbWVtYmVycy5wdXNoX2JhY2sodHlwZSk7CgogICAgc3RkOjpjb3V0IDw8ICJIZWxsbyBXb3JsZCEiIDw8IHN0ZDo6ZW5kbDsKICAgIHJldHVybiAwOwp9