# 序列类型(sequence)

IDL 中的序列类型映射为:

  • 一个可以像数组一样使用的,具有当前长度和最大长度的 C++类。

当前 udds 仅支持无界序列的使用。

以下为无界序列的映射

考虑下列 IDL 描述

	//IDL
	//无界序列
	sequence<long> unbounded;

1
2
3
4

IDL 编译器将产生如下 C++定义:

	//C++
	sequence<long> unbounded;
squence 模板类函数提供的接口:
template <typename T>
class sequence{
public:
		sequence();							(1)
		sequence(const sequence &IDL_s); 	(2)
		sequence(unsigned long IDL_max);	(3)
		~sequence();								(4)
		sequence& operator= (const sequence &IDL_s); (5)
		T& operator [](unsigned long IDL_i);	 	(6)
		unsigned long get_maximum();			(7)
   		bool set_maximum(unsigned long new_max); (8)
    	unsigned long length() const;				(9)
		bool length(unsigned long len);			(10)
		bool ensure_length(unsigned long length,unsigned long max); (11)
    	bool copy(const sequence &src_seq);		(12)
    	const T get_at(unsigned long i);			 (13)
    	T& set_at(unsigned long i, const  T& val); (14)
    	T* get_buffer();							  (15)
    	bool from_array(const T array[], unsigned long copy_length); (16)
    	bool to_array(T array[], unsigned long copy_length); (17)
		bool unloan();							(18)
private:
   	私有函数
private:
		unsigned long _maximum;
		unsigned long _length;
		unsigned long _release;
		T* _buffer;
};

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

构造函数、析构函数和赋值操作

缺省构造函数(1)将序列长度和最大长度都设置为 0。

拷贝构造函数(2)创建一个长度及最大长度都和所给序列相同的新序列,并复制其每个元素。

构造函数(3)分配新的存储区。

析构函数(4)释放所有空间

重载运算符

重载运算符“ = ”函数(5),调用 copy 实现等号右边的模板类对象对等号左边的模板类对象赋值。

重载运算符“ [] ”函数(6),获取对应下编号数据

其他函数

函数(7)get_maximum()

获取当前序列缓存区可存储数据最大值;

函数(8)set_maximum()

根据参数申请相应大小的新缓冲区,将旧缓冲区数据复制到新缓冲区并释放旧缓冲区。

函数(9)length()

获取实际已使用的缓冲区大小值。

函数(10)length()

设置新已使用缓冲区大小值(该新值应小于 maximum 值否则返回 false)。

函数(11)ensure_length ()

根据参数判定,ensure_len > max 时返回 false, Sequence 有足够的空间则仅重置 length 值,空间不足且当前缓冲区为自有(即通过调用 set_maximum()函数申请的缓存)则调用 maximum 函数重置 Sequence 空间再重置 length 值,若缓冲区不为自有则返回 false(不可释放)。

函数(12)copy ()

增加缓冲区大小的复制, 要复制的缓冲区长度比当前 Sequence 的缓冲区大小要小,符合条件则直接进行复制操作,否则调用 set_maximum()重新初始化缓冲区大小使得有充足的缓冲区接收要拷贝的数据再进行复制操作。

函数(13)get_at ()

判定下标值可获取数据,返回缓冲区下标对应缓冲区值。

函数(14)set_at ()

判定下标值可获取数据,当缓冲区不为空时将缓冲区对应下标值替换为 val 参数值并返回,否则返回 NULL.

函数(15)get_buffer()

获取该 Sequence 的缓冲区。

函数(16)from_array ()

通过中间 Sequence 对象将 array 数组中的数据复制到当前 Sequence 对象中并释放中间 Sequence 对象。

函数(17)to_array ()

通过中间 Sequence 对象将当前 Sequence 对象的数据复制到 array 数组中并释放中间 Sequence 对象。

函数(18)unloan ()

判断该 Sequence 的缓冲区是否为借用,是则不释放缓冲区并初始化 Sequence 对象,否则释放缓冲区并初始化 Sequence 对象。

# IDL 定义示例

接口定义语言(IDL)字符串类型在 idl 文档中定义(以结构体为例):

struct  UserDataType{
	long l;
	sequence<long> seql;
};
1
2
3
4

# 代码示例

生成测试用例后在 pub.cpp 中创建数据样本后添加赋值语句:

/* 6. 创建一个数据样本 */
/* 建议:该数据需要申请空间后使用,使用后用户需要调用delete_data进行内存等资源的释放*/
	UserDataType *instance = NULL;
	instance = UserDataTypeTypeSupport::create_data();
	instance->l = 1;
	//sequence类型申请空间,参数:1,可使用空间;2,最大空间值
	instance->seql.ensure_length(1, 2);
	//赋值
	instance->seql [0] = 1;
//再次赋值需增加可使用空间值,使用ensure_length或length函数
	instance->seql.length(2);
	instance->seql [1] = 2;
	//再增加数据则最大空间已不够,则再次调用ensure_length函数同时添加最大空间值和可使用空间值
	instance->seql.ensure_length(4,4);
	instance->seql[2] = 3;
	instance->seql[3] = 4;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

# 数据收发示例:

图 1 为使用 IDL 定义示例 中结构体生成的测试 demo,在 Windows 系统上启动发布端、在 Linux 系统启动订阅端后数据收发情况。

图 1 序列类型数据收发示例(Windows->Linux)

图 2 为使用 IDL 定义示例 中结构体生成的测试 demo,在 Windows 系统上启动订阅端、在 Linux 系统启动发布端后数据收发情况。

图 2 序列类型数据收发示例(Linux -> Windows)