HTLSharp

来源:互联网 发布:数据库模型分为哪三种 编辑:程序博客网 时间:2024/06/06 11:11

介绍

HTLSharp是一个C#端口和HPC模板库(HTL)的升级。HTLHTLSharp库线程安全的容器,随机数生成器和分布,以及集成的序列化引擎提供的软件包。有关原始的更多信息HTL

HTLSharp库中的软件包如下所示:

包装说明运行状态HtlArchive:包含对象的序列化和反序列化所需的所有类。它包含一个通用的归档树/节点系统和不同的序列化程序包(XML,XDL,JSON等),它们保存了数据结构。归档模型(100%)XML(100%)XDL(100%)JSON(50%)HtlBase:包含使用HTL系统使对象可序列化的基类。(100%)HtlContainer:包含所有HTL的容器类(HtlVectorHtlMapHtlQueue等等)。这个集合中的所有容器都可以在HTL系统中进行序列化。 - (全面运作)(100%)HtlGlobal:包含全局使用的枚举类型,structs等(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可以序列的任何集成的数据类型(boolintlongfloatdoublestring,等),以及作为从继承的任何类HtlBaseHtlBase是一个轻量级的对象,只有两个成员变量(m_strTypem_objType)以及两个用于序列化(SaveLoad)的虚拟函数m_strType是在所使用的static object工厂,用于创建任何类型的继承自对象的HtlBase并已被登记。让我们看看SaveLoad方法。这是他们的原型:

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是单元测试项目中的一个类。这里是saveload方法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注意在TestObj01的布尔检查中print sub object成员变量的设置是通过调用HtlMemVar.SetMemVar<T>()方法来实现的您传入对当前节点的引用,该string成员变量名称以及对该对象的引用。注意所有的基础对象成员变量都被blnWithSubObjects设置为false

同样,该Load方法调用父类Load,然后继续调用交互GetMemVar<T>函数。应该指出的是,同时拥有Save一个Load方法和一个方法的原因是有时开发人员希望只写成员变量(比如GUIDs)。该系统也适用于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库中VectorList),MapDictionary)和Queue提供包装有了这三个基本的容器,你可以覆盖你的大部分需求。但是,如果需要另一个线程安全的包装,它们将为用户提供一个很好的路线图,以便如何创建一个。如前所述,容器(除了多线程支持)的主要意图是将其与归档系统集成。HtlTestSuite提供的单元测试提供了XML和XDL输出示例。JSON正在开发中,应该尽快添加。请参阅多线程测试和验证的单元测试。

HtlRandNumGen包

有两个随机数发生器(LCG和梅森倍捻机)和五个分布(HtlUniformHtlGammaHtlGaussianHtlPoissonHtlExponential)。提供均匀,指数和高斯的单元测试。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; }
原创粉丝点击