#include <bits/stdc++.h>
#include <string>
using namespace std;
struct curlybrace
{
const char *separator=",";
const char *closing_char="}";
const char *token_char=":";
} ;
struct value_array
{
const char *separator=",";
const char *closing_char="]";
const char *token_char=":";
};
class baseComp {
protected:
enum types {integer, floater, doubled, strings, array_t ,composite};
public:
virtual void parse() {};
virtual void print() {};
types check(const char* str) {
bool flag=false;
if (str=="[") {
return array_t;
}
else if (str,"{")
return composite;
while (*str++!='\0')
{
if ((*str>='0' && *str<='9'))
{
continue;
}else
{
if (!flag && *str=='.')
flag=true;
else if(flag && *str=='.')
return strings;
else if (flag && *str>='0' && *str<='9')
{
continue;
}
else
return strings;
}
}
if (flag) return floater;
else return integer;
}
};
template <class T>
class LeafComp: public baseComp
{
T data;
string key;
std::pair<string, T> m_p;
public:
LeafComp():baseComp() { }
LeafComp( T d, const char* k):baseComp(), data(d) { key= string(k);
m_p= std::make_pair(key, data);
}
void parse() {}
void print() {
cout<<key<<":"<<data<<endl;
}
};
template<>
void LeafComp<string>::print(){
cout<<"hi";
}
template<>
void LeafComp<vector<baseComp*>>:: print() {
for (baseComp* x: data) {
cout<<"["<<endl;
x->print();
cout<<"]"<<endl;
}
}
template<>
void LeafComp<baseComp*>:: print() {
cout<<"{"<<endl;
data->print();
cout<<"}"<<endl;
}
template<class del=curlybrace>
class Comp: public baseComp
{
protected :
const char** json_ptr;
const del delobj;
public:
const char* getStartDel(){
return delobj.separator;
};
const char* getEndchar(){
return delobj.closing_char;
};
const char* gettokenchar(){
return delobj.token_char;
}
const char* getseparator(){
return delobj.separator;
}
vector<baseComp*> components;
Comp (const char** sptr): baseComp(),json_ptr(sptr) {}
Comp():baseComp() {
json_ptr=nullptr;
}
void tokenise(string s);
void print() {
for_each (components.begin(), components.end(), [](baseComp* ptr){ ptr->print();});
}
void checks(types type_T, const char* t2 , const char* t1=nullptr){
switch ( type_T)
{
case integer:
{ LeafComp<int> *li= new LeafComp<int> (atoi(t2), t1);
components.push_back(li);
break;
}
case floater:
{ LeafComp<float>* lf = new LeafComp<float> (atof(t2), t1);
components.push_back(lf);
break;
}
case doubled:
{ LeafComp<double>* ld= new LeafComp<double> {atof(t2), t1};
components.push_back(ld);
break;
}
case strings:
{ LeafComp<string>*ls= new LeafComp<string> {string(t2), t1};
components.push_back(ls);
break;
}
case array_t:
{
const char ** ptr=&t2;
Comp<value_array>* ca= new Comp<value_array> (ptr);
ca->parse();
LeafComp<vector<baseComp*>>* la = new LeafComp<vector<baseComp*>> {ca->components, t1};
components.push_back(la);
break;
}
case composite:
{
//string newstr= string(t2).substr(1, strlen(t2)-1);
const char ** dummyptr=&t2;
Comp<curlybrace>* ca= new Comp<curlybrace> (dummyptr);
ca->parse();
components.insert(ca->components.end(),ca->components.begin(), ca->components.end());
break;
}
}
}
//parse
void parse()
{
string str=string("");
while( *(++(*json_ptr)) != '\0')
{
if(*json_ptr=="{")
{
Comp<curlybrace>* c= new Comp<curlybrace>(json_ptr);
c->parse();
components.push_back(c);
}
else if(*json_ptr==getEndchar() )
{
Comp<del>::tokenise(str);
str=string("");
}
else
str+=**json_ptr;
}
}
};
template<>
void Comp<value_array>::tokenise(string str){
char *tok1= nullptr;
const char * sep= getseparator();
tok1= strtok(&str[0], sep);
while(tok1!=NULL)
{
types type_T= check(tok1);
checks(type_T,tok1);
tok1= strtok(NULL,sep);
}
}
template<>
void Comp<curlybrace>::tokenise(string str){
char *tok1= nullptr; const char *tok2=nullptr;const char *tok3=nullptr;
vector<char*> v;
const char * sep= getseparator();
tok1= strtok(&str[0], sep);
v.push_back(tok1);
while (tok1!=NULL)
{
tok1=strtok(NULL,sep);
v.push_back(tok1);
}
for (auto tok: v){
tok2= strtok(tok, gettokenchar());
tok3= strtok(NULL, gettokenchar());
types type_T= check(tok3);
checks(type_T,tok3,tok2);
}
}
int main()
{
string json=string("{\"salary\": \"1lPA\", \"contract\":10}");
const char*ptr=&json[0];
const char** json_ptr=&ptr;
Comp<curlybrace> obj(json_ptr);
obj.parse();
obj.print();
//delete ptr;
return 0;
}