В классе FieldMap
есть итераторы, которые являются суперклассами классов Message
и Group
.
Я не уверен, что вы подразумеваете под анализом повторяющихся групп .
Механизм исправления анализирует необработанные сообщения исправления для вас, когда они приходят, и ваш обратный вызов получает проанализированное сообщение FIX, которое содержит внутренние карты тегов (ключ / значение) для тегов в заголовке сообщения, теле и хвосте.
Глядя на версию кода 1.13.2, когда движок получает новое строковое сообщение из сети, он в конечном итоге создаст Message
, передав ему строку. Затем конструктор Message
вызывает для себя setString()
, который эффективно анализирует полученную строку и создает карту тегов.
Если вы посмотрите на Message::setString
, вы увидите, что сначала добавляется новое поле, а затем в setGroup
проверяется, является ли поле частью группы. Если это так, то этот метод, setGroup
, выполняет разбор следующих тегов, в то время как эти теги являются частью группы. Как только он сталкивается с тегом, который не является частью группы, он прекращает синтаксический анализ группы, возвращает и продолжает анализировать поля из сообщения.
Теперь все это происходит внутри системы до обратного вызова вашего приложения, где вы обрабатываете полученное сообщение.
Существует способ перебирать поля в сообщении. Вы можете перебирать поля заголовка, тела или группы (и по каждой группе).
const FIX40::ExecutionReport& msg; // new incoming message
// iterate over header
FIX::FieldMap::iterator it;
FIX::FieldMap::iterator b = msg.getHeader().begin();
FIX::FieldMap::iterator e = msg.getHeader().end();
for(it = b; it != e; ++it)
{
switch(it->first)
{
case FIX::FIELD::MsgSeqnum:
/* it->second.getString() - do something with tag data*/ ;
break;
...
}
}
и аналогично для тела:
FIX::FieldMap::iterator it;
FIX::FieldMap::iterator b = msg.begin();
FIX::FieldMap::iterator e = msg.end();
И есть итератор групп (FieldMap::g_begin/g_end
), чтобы вы могли перебирать группы в сообщениях или заголовках, и вы можете аналогичным образом перебирать или искать теги в каждой группе.
Группа, а также Message расширяет FieldMap, поэтому все функции getField / setField являются общими для всех.
Internals ... пропустите, если слишком много деталей.
В приведенном выше примере этот код:
message.getGroup(1, group);
group.get(MDEntryType);
Эффективно передает вызов из message.getGroup(1, group)
-> FieldMap::getGroup(1, group.field(), group)
-> getGroupRef(num,field)
-> m_groups.find(field)
, который дает вам вектор групп (vector<FieldMap*>
) и возвращает элемент num
, то есть num
группа из сообщения (a FieldMap
).
group.get(field)
создается с использованием макросов для каждого тега, который фактически переводится как (map).getField(field)
.
Во время инициализации (map) для группы является ссылкой на объект, членом которого является тег, поэтому он возвращает тег из определенной группы (см. Пример src/C++/fix44/NewOrderSingle.h
, у него есть пара внутренних классов, расширяющих группу)
Надеюсь, что это имеет какой-то смысл.