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 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
|
#ifndef _messagestlcontainertypes_h
#define _messagestlcontainertypes_h
#include <list>
#include <vector>
#include "messagebasictypes.h"
namespace Msg
{
// forward declarations to allow nested templates
template <class T>
void pushFront(Message & message, const std::list<T> & value);
template <class T>
void popFront(Message & message, std::list<T> & returnValue);
template <class T>
void pushFront(Message & message, const std::vector<T> & value);
template <class T>
void popFront(Message & message, std::vector<T> & returnValue);
// end of forward declarations
template <class T>
void pushFront(Message & message, const std::list<T> & value)
{
typename std::list<T>::const_reverse_iterator it = value.rbegin(); // http://de.wikibooks.org/wiki/C++-Programmierung/_Die_STL/_Iteratoren
int listCountDown=value.size();
bool lastPart=true;
do
{
int partSize=listCountDown;
if (partSize>127)
{
partSize=127;
}
int partCountDown=partSize;
while (partCountDown>0)
{
pushFront(message, *it);
it++;
listCountDown--;
partCountDown--;
}
if (true==lastPart)
{
pushFrontuint8(message,partSize );
lastPart=false;
}
else
{
pushFrontuint8(message,partSize | 0x80 ); // continue flag
}
}
while (it != value.rend());
}
template <class T>
void popFront(Message & message, std::list<T> & returnValue)
{
returnValue.erase(returnValue.begin(),returnValue.end());
bool continueFlag=true;
while (continueFlag)
{
uint8 partSize;
popFrontuint8(message,partSize);
if (0x80 == (partSize&0x80) )
{
continueFlag=true;
partSize&=0x7f;
}
else
{
continueFlag=false;
}
for (int i=0; i<partSize; i++)
{
T oneValue;
popFront(message, oneValue);
returnValue.push_back(oneValue);
}
}
}
template <class T>
void pushFront(Message & message, const std::vector<T> & value)
{
typename std::vector<T>::const_reverse_iterator it = value.rbegin(); // http://de.wikibooks.org/wiki/C++-Programmierung/_Die_STL/_Iteratoren
int listCountDown=value.size();
bool lastPart=true;
do
{
int partSize=listCountDown;
if (partSize>127)
{
partSize=127;
}
int partCountDown=partSize;
while (partCountDown>0)
{
pushFront(message, *it);
it++;
listCountDown--;
partCountDown--;
}
if (true==lastPart)
{
pushFrontuint8(message,partSize );
lastPart=false;
}
else
{
pushFrontuint8(message,partSize | 0x80 ); // continue flag
}
}
while (it != value.rend());
}
template <class T>
void popFront(Message & message, std::vector<T> & returnValue)
{
returnValue.erase(returnValue.begin(),returnValue.end());
bool continueFlag=true;
while (continueFlag)
{
uint8 partSize;
popFrontuint8(message,partSize);
if (0x80 == (partSize&0x80) )
{
continueFlag=true;
partSize&=0x7f;
}
else
{
continueFlag=false;
}
for (int i=0; i<partSize; i++)
{
T oneValue;
popFront(message, oneValue);
returnValue.push_back(oneValue);
}
}
}
}
#endif // _messagestlcontainertypes_h
|