Простой способ добавить последовательности CORBA, используя переполнение стека

Я использую omniORB и C ++.

В моем приложении я получаю несколько небольших последовательностей CORBA из разных модулей, а затем мне нужно объединить их в одну большую последовательность для дальнейшей обработки.
Есть ли простой способ сделать это? Что-то вроде seq2.append(seq1) или же seq2.push_back(seq1), Или некоторые операторы? (Я действительно новичок в STL-вещах).

Единственный способ, который я нашел, — это вручную просмотреть каждый элемент небольших последовательностей и добавить его в большую последовательность.

//idl
struct Device;
typedef sequence<Device> DevicesList;

//c++
icore::DevicesList full_list;
foreach (const DStatusList &stlist, states_) {
icore::DevicesList list = convertList(stlist);
int newlength = full_list.length() + list.length();
int last_index = full_list.length();
full_list.length(newlength);
int j=0;
for(int i=last_index; i< last_index+list.length(); i++,j++) {
full_list[i] = list[j];
}
}

Спасибо.

4

Решение

Это не так сложно сделать маленькие вспомогательные функции для таких вещей, как это. Например, вы можете сделать свой собственный push_back для последовательностей CORBA:

template<class Seq, class T>
void push_back(Seq& seq, const T& item)
{
const CORBA::ULong len = seq.length();
seq.length(len + 1);
seq[len] = item;
}

MySequence s;
push_back(s, 42);

Просто имейте в виду, что некоторые типы последовательностей ORB не перераспределяют память на push_back (лайк std::vector делает), так что это может вызвать перераспределение и копирование на каждом push_back() вызов. Это может быть проблемой производительности. Вам нужно проверить, если ваш ORB делает это или нет, вероятно, посмотрев на источник, чтобы узнать, если это проблема. К сожалению, я думаю, что у omniORB есть эта проблема; по крайней мере, это было несколько лет назад.

Одним из способов смягчения этого является построение ваших последовательностей с максимальными значениями (если вы знаете это заранее). Это сделает одно большое выделение заранее, и вы можете позвонить push_back() до этого максимума без запуска перераспределения:

MySequence s(100);   // construct with maximum; allocation happens here
push_back(s, 42);    // no reallocation
push_back(s, 0);     // no reallocation

Я также согласен с советом Stefaanv в комментариях. Используйте последовательности CORBA как можно меньше. В основном используйте его «по краям» вашего приложения, где вам нужно делать / принимать вызовы CORBA. Получите данные в стандартные контейнеры, где ими будет легче манипулировать как можно скорее. Не позволяйте типам CORBA «просачиваться» в ваше приложение. Это также помогает сделать ваше приложение более переносимым, если вы когда-нибудь решите портировать его в среду, отличную от CORBA.

Я также слышал о новом отображении IDL в C ++ 11, которое предлагается. Это отобразит последовательности IDL прямо на std::vector что сделает вещи значительно проще.

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]