zoukankan      html  css  js  c++  java
  • 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 */
  • 相关阅读:
    ofbiz定时任务配置
    MySQL重置root密码
    谷歌默认最小字体解决方案
    CSS样式-文字在一行内显示不换行,超出部分用省略号(white-space、overflow、text-overflow、word-wrap、word-break)
    使用gulp自动化打包合并前端静态资源(CSS、JS文件压缩、添加版本号)
    JS判断两个日期是否为同一周
    AES、DES加解密方法(Java和JS编程)
    Nodejs代理解决开发环境下跨域问题
    js的垃圾收集机制以及写代码如何处理
    手机端黑屏时定时器无法执行
  • 原文地址:https://www.cnblogs.com/gavinliu1982/p/8400311.html
Copyright © 2011-2022 走看看