MessageSorters.cpp
Go to the documentation of this file.
00001 /****************************************************************************
00002 ** Copyright (c) 2001-2014
00003 **
00004 ** This file is part of the QuickFIX FIX Engine
00005 **
00006 ** This file may be distributed under the terms of the quickfixengine.org
00007 ** license as defined by quickfixengine.org and appearing in the file
00008 ** LICENSE included in the packaging of this file.
00009 **
00010 ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
00011 ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
00012 **
00013 ** See http://www.quickfixengine.org/LICENSE for licensing information.
00014 **
00015 ** Contact ask@quickfixengine.org if any conditions of this licensing are
00016 ** not clear to you.
00017 **
00018 ****************************************************************************/
00019 
00020 #ifdef _MSC_VER
00021 #include "stdafx.h"
00022 #else
00023 #include "config.h"
00024 #endif
00025 
00026 #include "MessageSorters.h"
00027 
00028 #include <string.h>
00029 
00030 namespace FIX
00031 {
00032 message_order::message_order( int first, ... )
00033 : m_mode( group ), m_delim( 0 ), m_largest( 0 )
00034 {
00035   int field = first;
00036   int size = 0;
00037   m_largest = m_delim = first;
00038 
00039   va_list arguments;
00040   va_start( arguments, first );
00041   while( field != 0 )
00042   {
00043       m_largest = m_largest > field ? m_largest : field;
00044       
00045       size++;
00046       field = va_arg( arguments, int );
00047   }
00048 
00049   if(size)
00050   {
00051       m_groupOrder = shared_array<int>::create(m_largest + 1);
00052 
00053       va_start( arguments, first );
00054       field = first;
00055       int i = 0;
00056       while( field != 0 )
00057       {
00058           m_groupOrder[ field ] = ++i;
00059           field = va_arg( arguments, int );
00060       }
00061   }
00062   else
00063   {
00064       m_largest = 0;
00065       m_delim = 0;
00066   }
00067 
00068   va_end( arguments );
00069 }
00070 
00071 message_order::message_order( const int order[] )
00072 : m_mode( group ), m_delim( 0 ), m_largest( 0 )
00073 {
00074   int size = 0;
00075   while( order[size] != 0 ) { ++size; }
00076   setOrder(size, order);
00077 }
00078 
00079 message_order& message_order::operator=( const message_order& rhs )
00080 {
00081   m_mode = rhs.m_mode;
00082   m_delim = rhs.m_delim;
00083   m_largest = rhs.m_largest;
00084   m_groupOrder = rhs.m_groupOrder;
00085 
00086   return *this;
00087 }
00088 
00089 void message_order::setOrder( int size, const int order[] )
00090 {
00091   if(size < 1) return;
00092   m_largest = m_delim = order[0];
00093 
00094   // collect all fields and find the largest field number
00095   for (int i = 1; i < size; ++i )
00096   {
00097       int field = order[i];
00098       m_largest = m_largest > field ? m_largest : field;
00099   }
00100 
00101   m_groupOrder = shared_array<int>::create(m_largest + 1);
00102   for (int i = 0; i < size; ++i )
00103       m_groupOrder[ order[ i ] ] = i + 1;
00104 }
00105 }

Generated on Mon Sep 15 2014 01:23:54 for QuickFIX by doxygen 1.7.6.1 written by Dimitri van Heesch, © 1997-2001