← index
libMXL/mxl/mxl.hpp
Source: libMXL/mxl/mxl.hpp
#ifndef __MXL___H__
#define __MXL___H__

#include<iostream>
#include<string>
#include<sstream>
#include<unordered_map>
#include<cstdlib>
#include<cstdio>
#include "symbol.hpp"


extern std::string current_name;
extern std::unordered_map<std::string, std::unordered_map<std::string, std::string> > vars;
extern void mxlerror(const char *src, ...);
extern int mxllineno;

namespace mxl {
    
    using subIt = std::unordered_map<std::string, std::string>::iterator;
    using It = std::unordered_map<std::string, std::unordered_map<std::string, std::string>>::iterator;
    
    class MXL {
    public:
        MXL() = default;
        MXL(const std::unordered_map<std::string, std::unordered_map<std::string, std::string>> &v);
        MXL(std::unordered_map<std::string, std::unordered_map<std::string, std::string>> &&v);
        MXL(const MXL &m);
        MXL(MXL &&m);
        MXL &operator=(const MXL &m);
        MXL &operator=(MXL &&m);
        MXL &operator+=(MXL &m);
        MXL &operator+=(std::unordered_map<std::string, std::unordered_map<std::string, std::string>> &v);
        
        std::string &operator()(std::string cat, std::string key);
        std::string &table(std::string cat, std::string key);
        
        bool loadFromFile(const std::string &n);
        
        template<typename T>
        void setTableValue(std::string cat, std::string key, const T &type) {
            std::ostringstream stream;
            stream << type;
            vars[cat][key] = stream.str();
        }
        
        
        subIt begin_sub(const std::string &n);
        subIt end_sub(const std::string &n);
        It begin_mxl();
        It end_mxl();
        
        long getTableInteger(std::string cat, std::string key);
        double getTableDouble(std::string cat, std::string key);
        void setValue(std::string cat, std::string key, std::string val);
        void echoTokens();
        bool writeToFile(std::string filename);
        bool sortedWriteToFile(std::string filename);
        static MXL *parseMXL(const std::string &n);
        void mergeMap(std::unordered_map<std::string, std::unordered_map<std::string, std::string>> &m);
        void mergeMap(MXL &m);
        bool keyValid(const std::string &cat, const std::string &key);
        std::unordered_map<std::string, std::unordered_map<std::string, std::string>> &mxlmap() { return vars; }
        std::unordered_map<std::string, std::unordered_map<std::string, std::string>> *operator->() { return &vars; }
    private:
        std::unordered_map<std::string, std::unordered_map<std::string, std::string>> vars;
    };
    
    bool readSource();
    bool readSource(std::string data);
    void echoTokens();
    std::string &getValue(std::string tag, std::string key);
    std::string trimQuotes(std::string value);
    extern int error_count;
}

#endif