//
// baseclass.hpp
// agent
//
// Created by liujc on 17/7/12.
// Copyright © 2017年 liujc. All rights reserved.
//
#ifndef baseclass_hpp
#define baseclass_hpp
#ifdef __GNUC__
#include <cxxabi.h>
#endif
#include <stdio.h>
#include <string>
#include <assert.h>
#include <stdlib.h>
#include <vector>
#include <map>
#include <string.h>
#include <typeinfo>
#include "../json-c/json.h"
#define __OSTYPE_IOS
using namespace std;
struct test_class_method{
string class_name;
string method_name;
};
class baseObject
{
public:
baseObject(){initLogObject();}
virtual ~baseObject(){}
virtual void run(const string params){}
string get_test_data();
test_class_method* get_test_method_name();
string get_callback_url();
string get_data_field_value(const string name);
void log(const string name, const string data);
void setTestData(const string data);
protected:
zdkjson_json_object *jtestdata=NULL;
private:
zdkjson_json_object *jlog=NULL;
void initLogObject();
void SplitString(const string& s, vector<string>& v, const string& c);
};
class baseObjectFactory
{
public:
typedef baseObject* (*CreateFunction)();
static baseObjectFactory & Instance()
{
static baseObjectFactory fac;
return fac;
}
static string ReadTypeName(const char* name){
#ifndef __GNUC__
const char * p = strstr(name, " ");
if (p)
{
size_t prev_len = (size_t)(p - name);
if (memcmp(name, "class", prev_len) == 0 ||
memcmp(name, "struct", prev_len) == 0 ||
memcmp(name, "enum", prev_len) == 0 ||
memcmp(name, "union", prev_len) == 0)
{
p += 1;
return string(p);
}
}
return string(name);
#else
char * real_name = abi::__cxa_demangle(name, nullptr, nullptr, nullptr);
string real_name_string(real_name);
free(real_name);
return real_name_string;
#endif
}
bool Regist(const char* name, CreateFunction func){
if (!func)
{
return false;
}
string type_name = ReadTypeName(name);
return _create_function_map.insert(make_pair(type_name, func)).second;
}
baseObject * Create(const string & type_name)
{
if (type_name.empty())
{
return NULL;
}
map<string, CreateFunction>::iterator it = _create_function_map.find(type_name);
if (it == _create_function_map.end())
{
return NULL;
}
return it->second();
}
template<typename T>
T * Create(const string & type_name)
{
baseObject * obj = Create(type_name);
if (!obj)
{
return NULL;
}
T * real_obj = dynamic_cast<T*>(obj);
if (!real_obj)
{
delete obj;
return NULL;
}
return real_obj;
}
public:
map<string, CreateFunction> _create_function_map;
};
template<typename T>
class baseObjectCreate : public baseObject
{
public:
static baseObject * CreateObject()
{
return new T();
}
struct Registor
{
Registor()
{
if (!baseObjectFactory::Instance().Regist(typeid(T).name(), CreateObject))
{
assert(false);
}
}
inline void do_nothing()const { }
};
static Registor s_registor;
public:
baseObjectCreate()
{
s_registor.do_nothing();
}
virtual ~baseObjectCreate()
{
s_registor.do_nothing();
}
};
template <typename T>
typename baseObjectCreate<T>::Registor baseObjectCreate<T>::s_registor;
#endif /* baseclass_hpp */