• C++中动态加载运行测试代码


    //
    //  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 */
  • 相关阅读:
    Ubuntu下systemd服务的配置
    编译压缩代码 MFCompress-src-1.01 :对‘***’未定义的引用
    德尔福 基础
    德尔福 XE5 安卓权限设置
    德尔福 XE5 安卓调试
    复制任意文件或文件夹到剪贴板
    无法完成安装:'Cannot access storage file '/
    Centos7.4安装kvm虚拟机(使用virt-manager管理)
    MSYS2 使用
    线程
  • 原文地址:https://www.cnblogs.com/gavinliu1982/p/8400311.html
Copyright © 2020-2023  润新知