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

Я использую 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];
    }
}

Спасибо.

1 ответ

Решение

Это не так сложно сделать маленькие вспомогательные функции для таких вещей, как это. Например, вы можете сделать свой собственный 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 что сделает вещи значительно проще.

Другие вопросы по тегам