HTLSharp
来源:互联网 发布:数据库模型分为哪三种 编辑:程序博客网 时间:2024/06/06 11:11
介绍
HTLSharp是一个C#端口和HPC模板库(HTL)的升级。在HTL
与HTLSharp
库线程安全的容器,随机数生成器和分布,以及集成的序列化引擎提供的软件包。有关原始的更多信息HTL
,
HTLSharp
库中的软件包如下所示:
HtlArchive
:包含对象的序列化和反序列化所需的所有类。它包含一个通用的归档树/节点系统和不同的序列化程序包(XML,XDL,JSON等),它们保存了数据结构。归档模型(100%)XML(100%)XDL(100%)JSON(50%)HtlBase
:包含使用HTL系统使对象可序列化的基类。(100%)HtlContainer
:包含所有HTL的容器类(HtlVector
,HtlMap
,HtlQueue
等等)。这个集合中的所有容器都可以在HTL系统中进行序列化。 - (全面运作)(100%)HtlGlobal
:包含全局使用的枚举类型,struct
s等(100%)HtlGUID
:包含三个全局唯一标识符(GUID); 64位,128位和256位(100%)HtlRandNumGen
:包含随机数生成器和随机分布生成器的系统。(100%)HtlString
:包含提供STL样式sprintf()
和sscanf()
方法的类。(100%)HtlTest
:包含HTL
单元测试系统。这是一个基于测试名称的单元测试系统,类似于boost,但是没有使用宏。(100%)HtlThread
:包含所有线程相关的类,包括互斥锁,信号量,线程等(100%)应该指出的是,一些包如信号和插槽没有从原始库移植到C#。这是因为事件处理基础结构已经存在于基本的C#库中。另外,尽管C#.NET中有一些多线程的容器,但是它们并没有与HTL序列化引擎集成,所以决定封装原始的通用容器。应该注意的是,在提供的源代码项目中,有一个单元测试项目来说明代码的用法。
HtlArchive包
以下部分将说明代码使用情况。该HTL
归档包是一个非常强大的序列化系统。系统使用通用对象树结构来表示内存中的任何数据结构。该数据结构独立于所使用的序列化方法。因此,相同的序列化结构可以提供XML序列化或JSON序列化。这允许开发人员编写类的代码,而不用担心序列化的方法。让我们开始吧。
HTLSharp
可以序列的任何集成的数据类型(bool
,int
,long
,float
,double
,string
,等),以及作为从继承的任何类HtlBase
。HtlBase
是一个轻量级的对象,只有两个成员变量(m_strType
和m_objType
)以及两个用于序列化(Save
和Load
)的虚拟函数; 的m_strType
是在所使用的static object
工厂,用于创建任何类型的继承自对象的HtlBase
并已被登记。让我们看看Save
和Load
方法。这是他们的原型:
public virtual int Save(ref HtlElement ptrCurrNode, ref string strMemVarName, bool blnWithSubObjects)public virtual int Load(ref HtlElement ptrCurrNode, ref string strMemVarName)
的HtlElement
传入是被保存或加载的通用数据结构的当前节点。这strMemVarName
是该string
节点的名称。Save
还有一个布尔标志传递是否sub
要写入对象。这在您只想在该级别进行浅层打印而不是sub
下面所有对象的情况下非常有用。现在让我们来看看他们实施。这TestObj2
是单元测试项目中的一个类。这里是save
和load
方法object
。
//Virtual Inheritance Serialization Engines//SERIALIZATION FUNCTIONS/////////////////////////////////////////!Save member data to the current element nodepublic override int Save(ref HtlElement ptrCurrNode, ref string strMemVarName, bool blnWithSubObjects){int intReturn = 0;//SAFETY CHECK //put at top of all Serialize Methodsif (ptrCurrNode == null) { return 0; };//CALL PARENT CLASS Serialize()base.Save(ref ptrCurrNode, ref strMemVarName, blnWithSubObjects);//strSTDBaseType.clear();//strBaseType.clear();//Standard Member VariablesintReturn &= HtlMemVar.SetMemVar<bool>(ref ptrCurrNode, "m_myBool", ref m_myBool, false);intReturn &= HtlMemVar.SetMemVar<int>(ref ptrCurrNode, "m_myInt01", ref m_myInt01, false);intReturn &= HtlMemVar.SetMemVar<double>(ref ptrCurrNode, "m_myDouble04", ref m_myDouble04, false);intReturn &= HtlMemVar.SetMemVar<string>(ref ptrCurrNode, "m_myString", ref m_myString, false); //Sub Object Member Variablesif (blnWithSubObjects){intReturn &= HtlMemVar.SetMemVar<TestObj01>(ref ptrCurrNode, "m_myTestObj", ref m_myTestObj, blnWithSubObjects);};return intReturn;}//!Load member data from the current element nodepublic override int Load(ref HtlElement ptrCurrNode, ref string strMemVarName){int intReturn = 0;//SAFETY CHECK //put at top of all Serialize Methodsif (ptrCurrNode == null) { return 0; };//CALL PARENT CLASS Serialize()base.Load(ref ptrCurrNode, ref strMemVarName);//Standard Member Variablesstring strRet = System.String.Empty;intReturn &= HtlMemVar.GetMemVar<bool>(ref ptrCurrNode, "m_myBool", ref m_myBool);intReturn &= HtlMemVar.GetMemVar<int>(ref ptrCurrNode, "m_myInt01", ref m_myInt01);intReturn &= HtlMemVar.GetMemVar<double>(ref ptrCurrNode, "m_myDouble04", ref m_myDouble04);intReturn &= HtlMemVar.GetMemVar<string>(ref ptrCurrNode, "m_myString", ref m_myString);intReturn &= HtlMemVar.GetMemVar<TestObj01>(ref ptrCurrNode, "m_myTestObj", ref m_myTestObj);return intReturn;}
该Save
方法的第一件事是调用父类的Save
方法。然后,继续设置该类的所有成员变量。在这种情况下,有一个bool
,一个int
,一double
,一个string
类型,并且一个子对象TestObj01
,其也从继承HtlBase
。注意在s TestObj01
的布尔检查中print sub object
。成员变量的设置是通过调用HtlMemVar.SetMemVar<T>()
方法来实现的。您传入对当前节点的引用,该string
成员变量的名称以及对该对象的引用。注意所有的基础对象成员变量都被blnWithSubObjects
设置为false
。
同样,该Load
方法调用父类Load
,然后继续调用交互GetMemVar<T>
函数。应该指出的是,同时拥有Save
一个Load
方法和一个方法的原因是有时开发人员希望只写成员变量(比如GUID
s)。该系统也适用于HTL中的所有容器。这是一个HtlVector
序列化的例子。
intReturn &= HtlMemVar.SetMemVar<HtlVector<TestObj01>> (ref ptrCurrNode, "m_arrObjs", ref m_arrObjs, true);
一旦save
被调用,用户就可以序列化所需的串行器。以下示例使用XDL序列化程序。
TestObj02 obj = new TestObj02();string strOut = System.String.Empty;string strTopName = "rootobject";HtlXDLWriter writer = new HtlXDLWriter();HtlElement root = new HtlElement();//serializeobj.Save(ref root, ref strTopName, true);root.UpdateIndexes();writer.SaveXDLTree(ref root, ref strOut, true);// Write the string to a file.System.IO.StreamWriter outfile = new System.IO.StreamWriter("HtlTestArch_XDL_Obj02Nested.out");outfile.Write(strOut);outfile.Close(); //clear the valuesobj.m_myBool = false;obj.m_myInt01 = -1;obj.m_myDouble04 = -1.0f;obj.m_myString = "null";obj.m_myTestObj.Reset();//now read it back in and deserializeHtlElementIndex xelem = new HtlElementIndex();HtlXDLReader reader = new HtlXDLReader();HtlElement readroot = new HtlElement();reader.LoadXDLTree(ref readroot, ref strOut, ref xelem);obj.Load(ref readroot, ref strTopName);
HtlContainer包
我们决定为C#.NET库中的Vector
(List
),Map
(Dictionary
)和Queue
类提供包装。有了这三个基本的容器,你可以覆盖你的大部分需求。但是,如果需要另一个线程安全的包装,它们将为用户提供一个很好的路线图,以便如何创建一个。如前所述,容器(除了多线程支持)的主要意图是将其与归档系统集成。所HtlTestSuite
提供的单元测试提供了XML和XDL输出示例。JSON正在开发中,应该尽快添加。请参阅多线程测试和验证的单元测试。
HtlRandNumGen包
有两个随机数发生器(LCG和梅森倍捻机)和五个分布(HtlUniform
,HtlGamma
,HtlGaussian
,HtlPoisson
,HtlExponential
)。提供均匀,指数和高斯的单元测试。RNG使用简单。只需创建对象,打电话initialize()
给你的种子,然后打电话next()
来获得下一个RNG。HtlUniform
也可以使用intGetNextAB()
或sngGetNextAB()
功能在一定范围内生成RNG 。
HtlGUID包
有64位,128位和256位全局唯一标识符可用。他们从继承,HtlBase
所以他们是直接序列化。有一点需要注意的是,他们是不同的windows GUID
类对称。所有的部分是相等的宽度。这里是一个例子HtlGUID128
:
975D3F24-F81FF9EB-2F556151-5F9D2204
这使得他们更简单的工作,其呈现更整洁。
HtlTest包
该HtlNode
软件包具有类似于HtlElement
归档软件包中的类的基于节点的体系结构。HtlTestNode
可以包含其他测试节点,根节点会触发所有的子节点。请参阅其中HtlTestSuite
的一个很好的例子。每个HtlTestNode
子类都有以下虚拟函数按需实现。在方法中按顺序触发这些public PerformTest()
方法。
public virtual int SetupTest() { return 0; }public virtual int PreProcessTest() { return 0; }public virtual int RunTest() { return 0; }public virtual int PostProcessTest() { return 0; }public virtual int ClearTest() { return 0; }
- HTLSharp
- BufferStream1
- JS之window对象
- Android 中的线程池
- spark算子之map_mapPartitions_mapPartitionsWithIndex
- java面试常见100+题
- HTLSharp
- LINUX 实现两个进程之间的通信
- Leetcode 740
- Planar data classification with one hidden layer v4课程一第三周编程作业
- centos 6.5 cms 5.3.6 cdh 5.3.6 安装
- JavaScript 数组的队列方法
- python从入门到入坟 二(吕万友)
- 在C#中理解和实现策略模式的绝对入门教程
- filter,编码过滤器