mindspore\mindspore\ccsrc\pipeline\jit\parsedate_couversion.cc代码标注1
小知识:
h文件是C语言和【C++】语言的头文件,一般在【.h】类的头文件里面只放入函数声明,宏定义,函数原型,而具体的实现在【.cpp】文件里面。
C程序的定义文件以.c为后缀,C++程序的定义文件通常以.cpp为后缀(也有一些系统以.cc或.cxx为后缀)
- 引用系统自带头文件
#include <unordered_map>
#include <utility>
#include <string>
#include <memory>
#include <vector>
-
引用自己编写的头文件,若找不到时再从系统头文件中寻找
#include "pipeline/jit/parse/resolve.h" #include "pipeline/jit/parse/python_adapter.h" #include "frontend/operator/ops.h" #include "frontend/operator/composite/composite.h" #include "ir/func_graph_cloner.h" #include "ir/cell.h" #include "utils/symbolic.h" #include "utils/ms_context.h"
-
创建一个名为mindspore的空间并在其中嵌套一个parse空间
namespace mindspore {
namespace parse {
}
}
- 将后面变量名指定别名,并导入变量到当前作用域,方便以后调用。
- :在此表示一种所属关系,作用域的意思
using Tensor = mindspore::tensor::Tensor;
using TensorPtr = mindspore::tensor::TensorPtr;
using MetaTensor = mindspore::tensor::MetaTensor;
using MetaTensorPtr = mindspore::tensor::MetaTensorPtr;
using InstanceCheckFunc = std::function<bool(const py::object &)>;
using InstanceConvertFunc = std::function<ValuePtr(const py::object &, bool, const TypePtr &)>;
定义了一个 DataConverter类,其中包括一些公有变量和私有变量,以virtural关键字修饰的虚函数
class DataConverter {
public://公有变量
explicit DataConverter(InstanceConvertFunc convert_func) : convert_func_(std::move(convert_func)) {}
virtual ~DataConverter() = default;//一个纯虚类作为回调接口
virtual bool Matched(const py::object &obj) = 0;//纯虚函数
virtual ValuePtr ConvertPyObject(const py::object &obj, bool use_sig, const TypePtr &dtype) {
if (convert_func_ == nullptr) {//如果convert_func_为空即等于0,错误日志记录"convert func is null"
MS_LOG(EXCEPTION) << "convert func is null";
}
return convert_func_(obj, use_sig, dtype);//返回 convert_func_所对应的obj, use_sig, dtype
}
private://私有变量
InstanceConvertFunc convert_func_ = nullptr;//初始化变量
};
template <typename T>//类模板函数模板,声明后可将类型参数用于类的成员函数和成员变量
class ByTypeDataConverter : public DataConverter {//定义一个类
public://公有变量
explicit ByTypeDataConverter(const InstanceConvertFunc &convert_func)//下面都是由都是由 explicit修饰的显示函数
: DataConverter(convert_func), check_func_(py::isinstance<T>) {}
explicit ByTypeDataConverter(const ValuePtr &converted_type)
: DataConverter(
[converted_type](const py::object &, bool, const TypePtr &) -> ValuePtr { return converted_type; }),
check_func_(py::isinstance<T>) {}
explicit ByTypeDataConverter(const ArgsObjConvertFunc &convert_func)
: DataConverter(
[convert_func](const py::object &obj, bool, const TypePtr &) -> ValuePtr { return convert_func(obj); }),
check_func_(py::isinstance<T>) {}
explicit ByTypeDataConverter(const ArgsObjSigConvertFunc &convert_func)
: DataConverter([convert_func](const py::object &obj, bool use_sig, const TypePtr &) -> ValuePtr {
return convert_func(obj, use_sig);
}),
check_func_(py::isinstance<T>) {}
explicit ByTypeDataConverter(const ArgsOjbTypeConvertFunc &convert_func)
: DataConverter([convert_func](const py::object &obj, bool, const TypePtr &dtype) -> ValuePtr {
return convert_func(obj, dtype);
}),
check_func_(py::isinstance<T>) {}
~ByTypeDataConverter() override = default;
bool Matched(const py::object &obj) override { return check_func_ != nullptr ? check_func_(obj) : false; }
private://私有变量
InstanceCheckFunc check_func_ = nullptr;//初始化赋值
};