cpglib

I recently wrote some libraries for CP. Finished one that prints stl, I will start writing the debugging one tomorrow. The break is even a little boring 🙁

#ifndef DEBUG_PRINT_H
#define DEBUG_PRINT_H

#include <iostream>
#include <tuple>
#include <vector>
#include <set>
#include <unordered_set>
#include <map>
#include <unordered_map>
#include <queue>
#include <stack>
#include <bitset>
#include <ext/pb_ds/assoc_container.hpp>
#include <boost/pfr.hpp>

#define INT32 0
#define INT64 1
#define UINT32 2
#define UINT64 3
#define FLOAT 4
#define DOUBLE 5
#define LONGDOUBLE 6
#define CHAR 7
#define CSTR 8
#define STRING 9
#define BOOL 10
#define PAIR 11
#define TUPLE 12
#define VECTOR 13
#define SET 14
#define UNORDEREDSET 15
#define MAP 16
#define UNORDEREDMAP 17
#define QUEUE 18
#define STACK 19
#define PRIORITYQUEUE 20
#define PBDS 21
#define MULTISET 22
#define STRUCTURE 23

std::string _split_name(std::string &args_name);
std::string _combine(const int32_t var_type, const std::string &var_value);

template<typename T, typename V> std::string _print(const std::pair<T, V> &var);
template<typename... Args> std::string _print(const std::tuple<Args...> &var);
template<typename T> std::string _print(const std::vector<T> &var);
template<typename T, class C> std::string _print(const std::set<T, C> &var);
template<typename T, class C> std::string _print(const std::unordered_set<T, C> &var);
template<typename T, typename V, class C> std::string _print(const std::map<T, V, C> &var);
template<typename T, typename V, class C> std::string _print(const std::unordered_map<T, V, C> &var);
template<typename T> std::string _print(const std::queue<T> &var);
template<typename T> std::string _print(const std::stack<T> &var);
template<typename T, typename C, typename comp> std::string _print(const std::priority_queue<T, C, comp> &var);
template <typename T, class C> std::string _print(const __gnu_pbds::tree<T, __gnu_pbds::null_type, C, __gnu_pbds::rb_tree_tag, __gnu_pbds::tree_order_statistics_node_update> &var);
template<typename T, class C> std::string _print(const std::multiset<T, C> &var);
template<typename T> std::string _print(const T &var);

std::string _print(const int32_t &var);
std::string _print(const long long &var);
std::string _print(const unsigned &var);
std::string _print(const unsigned long &var);
std::string _print(const unsigned long long &var);
std::string _print(const float &var);
std::string _print(const double &var);
std::string _print(const long double &var);
std::string _print(const char &var);
std::string _print(const char *var);
std::string _print(const std::string &var);
std::string _print(const bool &var);

// pair
template<typename T, typename V>
std::string _print(const std::pair<T, V> &var) {
    std::string first = _print(var.first);
    std::string second = _print(var.second);
    return _combine(PAIR, "[" + first + "," + second + "]");
}

// tuple
template<typename... Args>
std::string _print(const std::tuple<Args...> &var) {
    std::string s = "[";
    std::apply([&s](auto &&... args) { ((s += _print(args) + ","), ...); }, var);
    s.pop_back();
    s += "]";
    return _combine(TUPLE, s);
}

// vector
template<typename T>
std::string _print(const std::vector<T> &var) {
    std::string s = "[";
    for (auto &i: var) s += _print(i) + ",";
    s.pop_back();
    s += "]";
    return _combine(VECTOR, s);
}

// set
template<typename T, class C>
std::string _print(const std::set<T, C> &var) {
    std::string s = "[";
    for (auto &i: var) s += _print(i) + ",";
    s.pop_back();
    s += "]";
    return _combine(SET, s);
}

// unordered set
template<typename T, class C>
std::string _print(const std::unordered_set<T, C> &var) {
    std::string s = "[";
    for (auto &i: var) s += _print(i) + ",";
    s.pop_back();
    s += "]";
    return _combine(UNORDEREDSET, s);
}

// map
template<typename T, typename V, class C>
std::string _print(const std::map<T, V, C> &var) {
    std::string s = "[";
    for (auto &[i, j]: var) {
        std::string key = _print(i);
        std::string value = _print(j);
        s += "[" + key + "," + value + "],";
    }
    s.pop_back();
    s += "]";
    return _combine(MAP, s);
}

// unordered map
template<typename T, typename V, class C>
std::string _print(const std::unordered_map<T, V, C> &var) {
    std::string s = "[";
    for (auto &[i, j]: var) {
        std::string key = _print(i);
        std::string value = _print(j);
        s += "[" + key + "," + value + "],";
    }
    s.pop_back();
    s += "]";
    return _combine(UNORDEREDMAP, s);
}

// queue
template<typename T>
std::string _print(const std::queue<T> &var) {
    std::queue<T> tmp = var;
    std::string s = "[";
    while (!tmp.empty()) {
        s += _print(tmp.front()) + ",";
        tmp.pop();
    }
    s.pop_back();
    s += "]";
    return _combine(QUEUE, s);
}

// stack
template<typename T>
std::string _print(const std::stack<T> &var) {
    std::stack<T> tmp = var;
    std::string s = "[";
    while (!tmp.empty()) {
        s += _print(tmp.top()) + ",";
        tmp.pop();
    }
    s.pop_back();
    s += "]";
    return _combine(QUEUE, s);
}

// priority queue
template<typename T, typename C, typename comp>
std::string _print(const std::priority_queue<T, C, comp> &var) {
    std::priority_queue<T, C, comp> tmp = var;
    std::string s = "[";
    while (!tmp.empty()) {
        s += _print(tmp.top()) + ",";
        tmp.pop();
    }
    s.pop_back();
    s += "]";
    return _combine(QUEUE, s);
}

// pbds
template <typename T, class C>
std::string _print(const __gnu_pbds::tree<T, __gnu_pbds::null_type, C, __gnu_pbds::rb_tree_tag, __gnu_pbds::tree_order_statistics_node_update> &var) {
    std::string s = "[";
    for (auto &i: var) s += _print(i) + ",";
    s.pop_back();
    s += "]";
    return _combine(PBDS, s);
}

// multiset
template<typename T, class C>
std::string _print(const std::multiset<T, C> &var) {
    std::string s = "[";
    for (auto &i: var) s += _print(i) + ",";
    s.pop_back();
    s += "]";
    return _combine(MULTISET, s);
}

// struct
template<typename T>
std::string _print(const T &var) {
    std::string s = "[";
    boost::pfr::for_each_field(var, [&](auto &&t) {
        s += _print(t) + ",";
    });
    s.pop_back();
    s += "]";
    return _combine(STRUCTURE, s);
}

// mode
// 0: inline
// 1: block
// 2: json
void _preprocess(const int32_t mode, std::vector<std::pair<std::string, std::string>> &args_list, std::string args_name);
template<typename T, typename... Args>
void _preprocess(const int32_t mode, std::vector<std::pair<std::string, std::string>> &args_list, std::string args_name, const T var, const Args... args) {
    args_list.emplace_back(make_pair(_split_name(args_name), _print(var)));
    _preprocess(mode, args_list, args_name, args...);
}

template<typename... Args>
void _debug_print(const int32_t mode, const std::string args_name, const Args... args) {
    std::vector<std::pair<std::string, std::string>> args_list;
    _preprocess(mode, args_list, args_name, args...);
}

#endif
#include "print.h"
#include <nlohmann/json.hpp>
#include <fstream>
#include <filesystem>

#define COLORPRINT(x, d) std::cerr<<FORE_COLOR_LIST[(d)]<<(x)<<COLOR_SUFFIX
#define PADDING(x) for(int i_=0;i_<(4*(x));++i_)std::cerr<<" ";

const std::string COLOR_PREFIX = "\e[41m";
const std::string COLOR_NAME_PREFIX = "\e[45m";
const std::string COLOR_SUFFIX = "\e[0m";
const std::string BACK_COLOR_LIST[] = {"", "\033[1;32m", "\033[1;34m", "\033[1;39m", "\033[1;37m"};
const std::string FORE_COLOR_LIST[] = {"\033[1;31m", "\033[1;32m", "\033[1;33m", "\033[1;35m", "\033[1;36m"};

std::string add_single_quotes(const std::string &s) {return "\'" + s + "\'"; }
std::string add_double_quotes(const std::string &s) {return "\"" + s + "\""; }

std::string _split_name(std::string &args_name) {
    size_t pos = args_name.find(", ");
    if (pos == std::string::npos) {
        std::string rtn = args_name;
        args_name.clear();
        return rtn;
    }
    std::string rtn = args_name.substr(0, pos);
    args_name.erase(0, pos + 2);
    return rtn;
}

std::string _combine(const int32_t var_type, const std::string &var_value) {
    std::string s = "{\"type\":" + std::to_string(var_type) + ",\"value\":" + var_value + "}";
    return s;
}

std::string _print(const int32_t &var) {return _combine(INT32, std::to_string(var)); }
std::string _print(const long long &var) {return _combine(INT64, std::to_string(var)); }
std::string _print(const unsigned &var) {return _combine(UINT32, std::to_string(var)); }
std::string _print(const unsigned long &var) {return _combine(UINT32, std::to_string(var)); }
std::string _print(const unsigned long long &var) {return _combine(UINT64, std::to_string(var)); }
std::string _print(const float &var) {return _combine(FLOAT, std::to_string(var)); }
std::string _print(const double &var) {return _combine(DOUBLE, std::to_string(var)); }
std::string _print(const long double &var) {return _combine(LONGDOUBLE, std::to_string(var)); }
std::string _print(const char &var) {std::string s(1, var); return _combine(CHAR, add_double_quotes(s)); }
std::string _print(const char *var) {return _combine(CSTR, add_double_quotes(var)); }
std::string _print(const std::string &var) {return _combine(STRING, add_double_quotes(var)); }
std::string _print(const bool &var) {return _combine(BOOL, var ? "true" : "false"); }

void print_inline(const nlohmann::json obj) {
    int32_t var_type = obj["type"];
    nlohmann::json var = obj["value"];
    switch (var_type) {
        case INT32:
            std::cerr << var.get<int32_t>();
            break;
        case INT64:
            std::cerr << var.get<int64_t>();
            break;
        case UINT32:
            std::cerr << var.get<uint32_t>();
            break;
        case UINT64:
            std::cerr << var.get<uint64_t>();
            break;
        case FLOAT:
            std::cerr << var.get<float>();
            break;
        case DOUBLE:
            std::cerr << var.get<double>();
            break;
        case LONGDOUBLE:
            std::cerr << var.get<long double>();
            break;
        case CHAR:
            std::cerr << "\'" << var.get<std::string>() << "\'";
            break;
        case CSTR:
            std::cerr << "\"" << var.get<std::string>() << "\"";
            break;
        case STRING:
            std::cerr << "\"" << var.get<std::string>() << "\"";
            break;
        case BOOL:
            std::cerr << (var.get<bool>() ? "true" : "false");
            break;
        case PAIR:
            std::cerr << "{";
            print_inline(var[0]);
            std::cerr << ", ";
            print_inline(var[1]);
            std::cerr << "}";
            break;
        case TUPLE:
            std::cerr << "{";
            for (int i = 0; i < (int32_t)var.size(); ++i) {
                print_inline(var[i]);
                if (i + 1 != (int32_t)var.size()) std::cerr << ", ";
            }
            std::cerr << "}";
            break;
        case VECTOR:
            std::cerr << "[";
            for (int i = 0; i < (int32_t)var.size(); ++i) {
                print_inline(var[i]);
                if (i + 1 != (int32_t)var.size()) std::cerr << ", ";
            }
            std::cerr << "]";
            break;
        case SET:
            std::cerr << "{";
            for (int i = 0; i < (int32_t)var.size(); ++i) {
                print_inline(var[i]);
                if (i + 1 != (int32_t)var.size()) std::cerr << ", ";
            }
            std::cerr << "}";
            break;
        case UNORDEREDSET:
            std::cerr << "{";
            for (int i = 0; i < (int32_t)var.size(); ++i) {
                print_inline(var[i]);
                if (i + 1 != (int32_t)var.size()) std::cerr << ", ";
            }
            std::cerr << "}";
            break;
        case MAP:
            std::cerr << "{";
            for (int i = 0; i < (int32_t)var.size(); ++i) {
                print_inline(var[i][0]);
                std::cerr << ": ";
                print_inline(var[i][1]);
                if (i != (int32_t)var.size() - 1) std::cerr << ", ";
            }
            std::cerr << "}";
            break;
        case UNORDEREDMAP:
            std::cerr << "{";
            for (int i = 0; i < (int32_t)var.size(); ++i) {
                print_inline(var[i][0]);
                std::cerr << ": ";
                print_inline(var[i][1]);
                if (i + 1 != (int32_t)var.size()) std::cerr << ", ";
            }
            std::cerr << "}";
            break;
        case QUEUE:
            std::cerr << "[";
            for (int i = 0; i < (int32_t)var.size(); ++i) {
                print_inline(var[i]);
                if (i + 1 != (int32_t)var.size()) std::cerr << ", ";
            }
            std::cerr << "]";
            break;
        case STACK:
            std::cerr << "[";
            for (int i = 0; i < (int32_t)var.size(); ++i) {
                print_inline(var[i]);
                if (i + 1 != (int32_t)var.size()) std::cerr << ", ";
            }
            std::cerr << "]";
            break;
        case PRIORITYQUEUE:
            std::cerr << "[";
            for (int i = 0; i < (int32_t)var.size(); ++i) {
                print_inline(var[i]);
                if (i + 1 != (int32_t)var.size()) std::cerr << ", ";
            }
            std::cerr << "]";
            break;
        case PBDS:
            std::cerr << "[";
            for (int i = 0; i < (int32_t)var.size(); ++i) {
                print_inline(var[i]);
                if (i + 1 != (int32_t)var.size()) std::cerr << ", ";
            }
            std::cerr << "]";
            break;
        case MULTISET:
            std::cerr << "{";
            for (int i = 0; i < (int32_t)var.size(); ++i) {
                print_inline(var[i]);
                if (i + 1 != (int32_t)var.size()) std::cerr << ", ";
            }
            std::cerr << "}";
            break;
        case STRUCTURE:
            std::cerr << "{";
            for (int i = 0; i < (int32_t)var.size(); ++i) {
                print_inline(var[i]);
                if (i + 1 != (int32_t)var.size()) std::cerr << ", ";
            }
            std::cerr << "}";
            break;
        default:
            break;
    }
}

void process_inline(std::vector<std::pair<std::string, std::string>> &args_list) {
    for (int i = 0; i < (int32_t)args_list.size(); ++i) {
        std::string var_name = args_list[i].first;
        nlohmann::json obj = nlohmann::json::parse(args_list[i].second);

        std::cerr << COLOR_NAME_PREFIX << " " << var_name << " " << COLOR_SUFFIX;
        std::cerr << " = ";
        std::cerr << COLOR_PREFIX << " ";
        print_inline(obj);
        std::cerr << " " << COLOR_SUFFIX;
        std::cerr << (i + 1 == (int32_t)args_list.size() ? "\n" : " ,  ");
    }
}

bool is_basic(nlohmann::json obj) {
    int32_t var_type = obj["type"];
    return var_type <= 10;
}

void print_block(const nlohmann::json obj, const int32_t depth, const bool colored) {
    int32_t var_type = obj["type"];
    nlohmann::json var = obj["value"];
    switch (var_type) {
        case INT32:
            if (colored) COLORPRINT(var.get<int32_t>(), depth);
            else std::cerr << var.get<int32_t>();
            break;
        case INT64:
            if (colored) COLORPRINT(var.get<int64_t>(), depth);
            else std::cerr << var.get<int64_t>();
            break;
        case UINT32:
            if (colored) COLORPRINT(var.get<uint32_t>(), depth);
            else std::cerr << var.get<uint32_t>();
            break;
        case UINT64:
            if (colored) COLORPRINT(var.get<uint64_t>(), depth);
            else std::cerr << var.get<uint64_t>();
            break;
        case FLOAT:
            if (colored) COLORPRINT(var.get<float>(), depth);
            else std::cerr << var.get<float>();
            break;
        case DOUBLE:
            if (colored) COLORPRINT(var.get<double>(), depth);
            else std::cerr << var.get<double>();
            break;
        case LONGDOUBLE:
            if (colored) COLORPRINT(var.get<long double>(), depth);
            else std::cerr << var.get<long double>();
            break;
        case CHAR:
            if (colored) {
                COLORPRINT("\'", depth);
                COLORPRINT(var.get<std::string>(), depth);
                COLORPRINT("\'", depth);
            }
            else std::cerr << "\'" << var.get<std::string>() << "\'";
            break;
        case CSTR:
            if (colored) {
                COLORPRINT("\"", depth);
                COLORPRINT(var.get<std::string>(), depth);
                COLORPRINT("\"", depth);
            }
            else std::cerr << "\"" << var.get<std::string>() << "\"";
            break;
        case STRING:
            if (colored) {
                COLORPRINT("\"", depth);
                COLORPRINT(var.get<std::string>(), depth);
                COLORPRINT("\"", depth);
            }
            else std::cerr << "\"" << var.get<std::string>() << "\"";
            break;
        case BOOL:
            if (colored) COLORPRINT(var.get<bool>() ? "true" : "false", depth);
            else std::cerr << (var.get<bool>() ? "true" : "false");
            break;
        case PAIR:
            COLORPRINT("pair {\n", depth);
            PADDING(depth + 1); COLORPRINT("first : ", depth); print_block(var[0], depth + 1, false);
            if (is_basic(var[0])) std::cerr << std::endl;
            PADDING(depth + 1); COLORPRINT("second: ", depth); print_block(var[1], depth + 1, false);
            if (is_basic(var[1])) std::cerr << std::endl;
            COLORPRINT("}", depth);
            std::cerr << std::endl;
            break;
        case TUPLE:
            COLORPRINT("tuple [\n", depth);
            for (int i = 0; i < (int32_t)var.size(); ++i) {
                PADDING(depth + 1);
                print_block(var[i], depth + 1, false);
                if (is_basic(var[i])) std::cerr << std::endl;
            }
            PADDING(depth); COLORPRINT("}", depth);
            std::cerr << std::endl;
            break;
        case VECTOR:
            COLORPRINT("vector [\n", depth);
            for (int i = 0; i < (int32_t)var.size(); ++i) {
                PADDING(depth + 1);
                COLORPRINT(i, depth); COLORPRINT(": ", depth);
                print_block(var[i], depth + 1, false);
                if (is_basic(var[i])) std::cerr << std::endl;
            }
            PADDING(depth); COLORPRINT("]", depth);
            std::cerr << std::endl;
            break;
        case SET:
            COLORPRINT("set {\n", depth);
            for (int i = 0; i < (int32_t)var.size(); ++i) {
                PADDING(depth + 1);
                COLORPRINT(i, depth); COLORPRINT(": ", depth);
                print_block(var[i], depth + 1, false);
                if (is_basic(var[i])) std::cerr << std::endl;
            }
            PADDING(depth); COLORPRINT("]", depth);
            std::cerr << std::endl;
            break;
        case UNORDEREDSET:
            COLORPRINT("unordered set {\n", depth);
            for (int i = 0; i < (int32_t)var.size(); ++i) {
                PADDING(depth + 1);
                COLORPRINT(i, depth); COLORPRINT(": ", depth);
                print_block(var[i], depth + 1, false);
                if (is_basic(var[i])) std::cerr << std::endl;
            }
            PADDING(depth); COLORPRINT("]", depth);
            std::cerr << std::endl;
            break;
        case MAP:
            COLORPRINT("map {\n", depth);
            for (int i = 0; i < (int32_t)var.size(); ++i) {
                PADDING(depth + 1);
                print_block(var[i][0], depth, true);
                COLORPRINT(": ", depth);
                print_block(var[i][1], depth, false);
                if (is_basic(var[i][1])) std::cerr << std::endl;
            }
            PADDING(depth); COLORPRINT("}", depth);
            std::cerr << std::endl;
            break;
        case UNORDEREDMAP:
            COLORPRINT("unordered map {\n", depth);
            for (int i = 0; i < (int32_t)var.size(); ++i) {
                PADDING(depth + 1);
                print_block(var[i][0], depth, true);
                COLORPRINT(": ", depth);
                print_block(var[i][1], depth, false);
                if (is_basic(var[i][1])) std::cerr << std::endl;
            }
            PADDING(depth); COLORPRINT("}", depth);
            std::cerr << std::endl;
            break;
        case QUEUE:
            COLORPRINT("queue [\n", depth);
            for (int i = 0; i < (int32_t)var.size(); ++i) {
                PADDING(depth + 1);
                COLORPRINT(i, depth); COLORPRINT(": ", depth);
                print_block(var[i], depth + 1, false);
                if (is_basic(var[i])) std::cerr << std::endl;
            }
            PADDING(depth); COLORPRINT("]", depth);
            std::cerr << std::endl;
            break;
        case STACK:
            COLORPRINT("stack [\n", depth);
            for (int i = 0; i < (int32_t)var.size(); ++i) {
                PADDING(depth + 1);
                COLORPRINT(i, depth); COLORPRINT(": ", depth);
                print_block(var[i], depth + 1, false);
                if (is_basic(var[i])) std::cerr << std::endl;
            }
            PADDING(depth); COLORPRINT("]", depth);
            std::cerr << std::endl;
            break;
        case PRIORITYQUEUE:
            COLORPRINT("priority_queue [\n", depth);
            for (int i = 0; i < (int32_t)var.size(); ++i) {
                PADDING(depth + 1);
                COLORPRINT(i, depth); COLORPRINT(": ", depth);
                print_block(var[i], depth + 1, false);
                if (is_basic(var[i])) std::cerr << std::endl;
            }
            PADDING(depth); COLORPRINT("]", depth);
            std::cerr << std::endl;
            break;
        case PBDS:
            COLORPRINT("pbds [\n", depth);
            for (int i = 0; i < (int32_t)var.size(); ++i) {
                PADDING(depth + 1);
                COLORPRINT(i, depth); COLORPRINT(": ", depth);
                print_block(var[i], depth + 1, false);
                if (is_basic(var[i])) std::cerr << std::endl;
            }
            PADDING(depth); COLORPRINT("]", depth);
            std::cerr << std::endl;
            break;
        case MULTISET:
            COLORPRINT("multiset {\n", depth);
            for (int i = 0; i < (int32_t)var.size(); ++i) {
                PADDING(depth + 1);
                COLORPRINT(i, depth); COLORPRINT(": ", depth);
                print_block(var[i], depth + 1, false);
                if (is_basic(var[i])) std::cerr << std::endl;
            }
            PADDING(depth); COLORPRINT("}", depth);
            std::cerr << std::endl;
            break;
        case STRUCTURE:
            COLORPRINT("struct {\n", depth);
            for (int i = 0; i < (int32_t)var.size(); ++i) {
                PADDING(depth + 1);
                print_block(var[i], depth + 1, false);
                if (is_basic(var[i])) std::cerr << std::endl;
            }
            PADDING(depth); COLORPRINT("}", depth);
            std::cerr << std::endl;
            break;
        default:
            break;
    }
}

void process_block(std::vector<std::pair<std::string, std::string>> &args_list) {
    for (int i = 0; i < (int32_t)args_list.size(); ++i) {
        std::string var_name = args_list[i].first;
        nlohmann::json obj = nlohmann::json::parse(args_list[i].second);

        std::cerr << COLOR_NAME_PREFIX << " " << var_name << " " << COLOR_SUFFIX << " =" << std::endl;
        print_block(obj, 0, false);
        if (is_basic(obj)) std::cerr << std::endl;
        if (i + 1 == (int32_t)args_list.size()) std::cerr << std::endl;
    }
}

nlohmann::json print_json(const nlohmann::json &obj) {
    int32_t var_type = obj["type"];
    nlohmann::json var = obj["value"];
    nlohmann::json rtn;
    switch (var_type) {
        case INT32: return var.get<int32_t>();
        case INT64: return var.get<int64_t>();
        case UINT32: return var.get<uint32_t>();
        case UINT64: return var.get<uint64_t>();
        case FLOAT: return var.get<float>();
        case DOUBLE: return var.get<double>();
        case LONGDOUBLE: return var.get<long double>();
        case CHAR: return var.get<std::string>();
        case CSTR: return var.get<std::string>();
        case STRING: return var.get<std::string>();
        case BOOL: return var.get<bool>();
        case PAIR:
            rtn["first"] = print_json(var[0]);
            rtn["second"] = print_json(var[1]);
            return rtn;
        case TUPLE:
            for (int i = 0; i < (int32_t)var.size(); ++i) rtn.push_back(print_json(var[i]));
            return rtn;
        case VECTOR:
            for (int i = 0; i < (int32_t)var.size(); ++i) rtn.push_back(print_json(var[i]));
            return rtn;
        case SET:
            for (int i = 0; i < (int32_t)var.size(); ++i) rtn.push_back(print_json(var[i]));
            return rtn;
        case UNORDEREDSET:
            for (int i = 0; i < (int32_t)var.size(); ++i) rtn.push_back(print_json(var[i]));
            return rtn;
        case MAP:
            for (int i = 0; i < (int32_t)var.size(); ++i) {
                std::string key = print_json(var[i][0]).dump();
                if (key[0] == '\"') key = key.substr(1, (int32_t)(key.size() - 2));
                rtn[key] = print_json(var[i][1]);
            }
            return rtn;
        case UNORDEREDMAP:
            for (int i = 0; i < (int32_t)var.size(); ++i) {
                std::string key = print_json(var[i][0]).dump();
                if (key[0] == '\"') key = key.substr(1, (int32_t)(key.size() - 2));
                rtn[key] = print_json(var[i][1]);
            }
            return rtn;
        case QUEUE:
            for (int i = 0; i < (int32_t)var.size(); ++i) rtn.push_back(print_json(var[i]));
            return rtn;
        case STACK:
            for (int i = 0; i < (int32_t)var.size(); ++i) rtn.push_back(print_json(var[i]));
            return rtn;
        case PRIORITYQUEUE:
            for (int i = 0; i < (int32_t)var.size(); ++i) rtn.push_back(print_json(var[i]));
            return rtn;
        case PBDS:
            for (int i = 0; i < (int32_t)var.size(); ++i) rtn.push_back(print_json(var[i]));
            return rtn;
        case MULTISET:
            for (int i = 0; i < (int32_t)var.size(); ++i) rtn.push_back(print_json(var[i]));
            return rtn;
        case STRUCTURE:
            for (int i = 0; i < (int32_t)var.size(); ++i) rtn.push_back(print_json(var[i]));
            return rtn;
        default:
            return rtn;
    }
}

void process_json(std::vector<std::pair<std::string, std::string>> &args_list) {
    std::filesystem::path dir("cppjson");
    if (!std::filesystem::exists(dir)) std::filesystem::create_directories(dir);
    for (int i = 0; i < (int32_t)args_list.size(); ++i) {
        std::string var_name = args_list[i].first;
        std::ofstream f("cppjson/" + var_name + ".json");
        nlohmann::json src = nlohmann::json::parse(args_list[i].second);
        nlohmann::json obj = print_json(src);
        f << obj.dump(4);
        f.close();
    }
}

void _preprocess(const int32_t mode, std::vector<std::pair<std::string, std::string>> &args_list, std::string args_name) {
    (void)args_name;
    if (mode == 0) process_inline(args_list);
    else if (mode == 1) process_block(args_list);
    else if (mode == 2) process_json(args_list);
}
No Comments

Send Comment Edit Comment


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
Previous
Next