Net/cpart.h

121 lines
3.5 KiB
C
Raw Normal View History

2019-01-13 12:48:58 +00:00
//
// cpart.h
// Net
//
// Created by 胡一兵 on 2019/1/13.
// Copyright © 2019年 Bakantu. All rights reserved.
//
#ifndef cpart_h
#define cpart_h
2019-01-14 09:19:45 +00:00
#include <unistd.h>
2019-01-13 12:48:58 +00:00
#include <dlfcn.h>
#include <string>
#include <vector>
using std::vector;
using std::string;
2019-01-14 10:35:09 +00:00
//声明计算模块的传入与传出参数列表
2019-01-14 09:19:45 +00:00
#define ARGS_DECLAER(name) vector<void *> __##name##_args_in, __##name##_args_out
2019-01-14 10:35:09 +00:00
//声明计算模块的入口
2019-01-14 09:19:45 +00:00
#define PCSFUNC_DEFINE(name) extern "C" int name(void)
#define GET_ARGS(name,type) CPart::popArg<type>(&__##name##_args_in)
#define ADD_ARGS(name,type,value) CPart::addArg<type>(&__##name##_args_out, value);
2019-01-14 10:35:09 +00:00
//从传入参数列表的第一个值,并删除该值
2019-01-14 09:19:45 +00:00
#define POP_ARGS(name,type) GET_ARGS( name ,type)
2019-01-14 10:35:09 +00:00
//向传出参数列表中添加值
2019-01-14 09:19:45 +00:00
#define PUSH_ARGS(name,type,value) ADD_ARGS( name ,type,value)
2019-01-13 16:57:56 +00:00
#define INT 0
#define DOUBLE 1
2019-01-14 10:35:09 +00:00
//调用计算模块成功的返回
2019-01-13 12:48:58 +00:00
#define SUCCESS 0
2019-01-14 10:35:09 +00:00
//调用计算模块失败的返回
#define FAIL -1
2019-01-13 12:48:58 +00:00
2019-01-14 09:19:45 +00:00
typedef int(*PCSFUNC)(void);
2019-01-13 12:48:58 +00:00
2019-01-13 16:57:56 +00:00
class CPart;
2019-01-14 10:35:09 +00:00
//计算模块管理对象间的依赖关系
2019-01-13 16:57:56 +00:00
class Depends{
public:
2019-01-14 10:35:09 +00:00
// 指向依赖的计算模块管理对象的指针
2019-01-13 16:57:56 +00:00
CPart *t_cpart;
2019-01-14 10:35:09 +00:00
// 所依赖的输入参数在计算模块输入参数列表中的序号
2019-01-13 16:57:56 +00:00
vector<int> args;
};
2019-01-14 10:35:09 +00:00
//计算模块管理对象
2019-01-13 12:48:58 +00:00
class CPart{
public:
2019-01-14 10:35:09 +00:00
// 参数形式信息列表
2019-01-13 12:48:58 +00:00
vector<int> fargs_in, fargs_out;
2019-01-14 10:35:09 +00:00
// 参数操纵列表
2019-01-13 12:48:58 +00:00
vector<void *> args_in, args_out;
2019-01-14 10:35:09 +00:00
// lib文件中相关参数操纵列表的地址
2019-01-14 09:19:45 +00:00
vector<void *> *libargs_in,*libargs_out;
2019-01-14 10:35:09 +00:00
// 所依赖的计算对象列表
2019-01-13 16:57:56 +00:00
vector<Depends> depends;
2019-01-14 10:35:09 +00:00
// lib文件中的计算模块的入口地址
2019-01-14 09:19:45 +00:00
int (*func)(void);
2019-01-14 10:35:09 +00:00
// lib文件操作柄
2019-01-13 12:48:58 +00:00
void *handle;
2019-01-14 10:35:09 +00:00
// 源文件所在目录
string src_path;
// 计算模块名
string name;
// lib文件名
string libname;
// 源文件名
string src_name;
// 当计算模块随着该工具同时编译时可以直接使用该构造函数
2019-01-14 09:19:45 +00:00
CPart(PCSFUNC func):func(func),handle(nullptr){}
2019-01-14 10:35:09 +00:00
// 一般构造函数,计算模块在文件中以源文件的形式独立存在时使用该构造函数
CPart(string src_path,string src_name,string name,bool ffresh = true);
// 析构函数
2019-01-14 09:19:45 +00:00
~CPart();
2019-01-14 10:35:09 +00:00
// 设置输入输出参数形式信息
2019-01-14 09:19:45 +00:00
void setArgsType(vector<int> fargs_in, vector<int> fargs_out);
2019-01-14 10:35:09 +00:00
// 编译源文件
int BuildSo(void);
// 获得lib文件操作柄
int GetSo(void);
// 运行计算模块
2019-01-14 09:19:45 +00:00
int Run(void);
2019-01-14 10:35:09 +00:00
// 清空计算历史记录
2019-01-14 09:19:45 +00:00
void Clear(void);
2019-01-13 12:48:58 +00:00
2019-01-14 10:35:09 +00:00
// 在对象的传入参数列表中添加参数值
2019-01-14 09:19:45 +00:00
template<class T> void addArgsIn(T value){
T *p_value = new T(value);
2019-01-14 10:35:09 +00:00
if(p_value == nullptr) throw "fail to malloc";
2019-01-13 12:48:58 +00:00
args_in.push_back(p_value);
}
2019-01-14 10:35:09 +00:00
// 一般由lib文件中的计算模块调用的向vector中添加参数并分配内存空间而后初始化
2019-01-13 12:48:58 +00:00
template<class T>
2019-01-14 09:19:45 +00:00
static void addArg(vector<void *> *args,T value){
2019-01-13 12:48:58 +00:00
T *p_value = new T(value);
2019-01-14 10:35:09 +00:00
if(p_value == nullptr) throw "fail to malloc";
2019-01-14 09:19:45 +00:00
args->push_back(p_value);
2019-01-13 12:48:58 +00:00
}
2019-01-14 10:35:09 +00:00
// 一般由lib文件中的计算模块调用的从vector中获得参数并释放其占用的内存空间而后返回相关值
2019-01-13 12:48:58 +00:00
template<class T>
2019-01-14 09:19:45 +00:00
static T popArg(vector<void *> *args){
2019-01-14 10:35:09 +00:00
if(args == nullptr) throw "the pointer to vector is null";
2019-01-14 09:19:45 +00:00
T *p_value = (T *)args->back();
2019-01-14 10:35:09 +00:00
T value = *p_value;
2019-01-14 09:19:45 +00:00
args->pop_back();
2019-01-14 10:35:09 +00:00
return value;
2019-01-13 12:48:58 +00:00
}
};
#endif /* cpart_h */