00001 #ifndef SCT_OMNIMARSHALLING_H
00002 #define SCT_OMNIMARSHALLING_H
00003
00004 #include <list>
00005 #include <set>
00006 #include <string>
00007 #include <vector>
00008 #include <ipc/core.h>
00009 #include "Sct/BugReport.h"
00010 #include "Sct/Addressing.h"
00011 #include "Sct/Addressing.hh"
00012
00013 namespace Sct {
00014
00023 inline Sct::Corba::UPID copyUPIDToCorba(const Sct::UPID & upid) {
00024 Sct::Corba::UPID ret;
00025 ret.partition = upid.partition();
00026 return ret;
00027 };
00028
00029 inline Sct::Corba::UCID copyUCIDToCorba(const Sct::UCID & ucid) {
00030 Sct::Corba::UCID ret;
00031 ret.partition = ucid.partition();
00032 ret.crate = ucid.crate();
00033 return ret;
00034 };
00035
00036 inline Sct::Corba::URID copyURIDToCorba(const Sct::URID & urid) {
00037 Sct::Corba::URID ret;
00038 ret.partition = urid.partition();
00039 ret.crate = urid.crate();
00040 ret.rod = urid.rod();
00041 return ret;
00042 };
00043
00044 inline Sct::UPID copyCorbaToUPID(const Sct::Corba::UPID & upid) {
00045 return Sct::UPID(upid.partition);
00046 };
00047
00048 inline Sct::UCID copyCorbaToUCID(const Sct::Corba::UCID & ucid) {
00049 return Sct::UCID(ucid.partition, ucid.crate);
00050 };
00051
00052 inline Sct::URID copyCorbaToURID(const Sct::Corba::URID & urid) {
00053 return Sct::URID(urid.partition, urid.crate, urid.rod);
00054 };
00055
00056 inline char *copyStringToCorba(const std::string & str) {
00057 char * ans = CORBA::string_dup(str.c_str());
00058 Sct::BugReport("BUG01","OMNI_MARSHALLING", std::string("OmniMarshalling has converted [")+str+"] into ["+ans+"]");
00059 return ans;
00060 }
00061
00062 template <typename CorbaSequence, typename ListMember>
00063 inline CorbaSequence *copyListToCorba(const std::list<ListMember> & thisList) {
00064 unsigned size=thisList.size();
00065 CorbaSequence *result = new CorbaSequence(size);
00066 result->length(size);
00067
00068 unsigned i=0;
00069 for(typename std::list<ListMember>::const_iterator m = thisList.begin();
00070 m!=thisList.end();
00071 m++) {
00072 (*result)[i] = *m;
00073 ++i;
00074 }
00075
00076 return result;
00077 }
00078
00079 template <typename CorbaSequence>
00080 inline CorbaSequence *copyStringListToCorba(const std::list<std::string> & thisList) {
00081 unsigned size = thisList.size();
00082 CorbaSequence *result = new CorbaSequence(size);
00083 result->length(size);
00084
00085 unsigned i=0;
00086 for(std::list<std::string>::const_iterator m = thisList.begin();
00087 m!=thisList.end();
00088 m++) {
00089 (*result)[i]=CORBA::string_dup(m->c_str());
00090 ++i;
00091 }
00092
00093 return result;
00094 }
00095
00096 template <typename CorbaSequence>
00097 inline CorbaSequence *copyStringSetToCorba(const std::set<std::string> & thisSet) {
00098 unsigned size = thisSet.size();
00099 CorbaSequence *result = new CorbaSequence(size);
00100 result->length(size);
00101
00102 unsigned i=0;
00103 for(std::set<std::string>::const_iterator m = thisSet.begin();
00104 m!=thisSet.end();
00105 m++) {
00106 (*result)[i]=CORBA::string_dup(m->c_str());
00107 ++i;
00108 }
00109
00110 return result;
00111 }
00112
00113 template <typename CorbaSequence, typename ListMember>
00114 inline std::list<ListMember> copyCorbaToList(const CorbaSequence * const thisSeq) {
00115 std::list<ListMember> result;
00116
00117 if (thisSeq) {
00118 for(unsigned int i=0; i<thisSeq->length(); i++) {
00119 result.push_back( ListMember((*thisSeq)[i]) );
00120 }
00121 }
00122 return result;
00123 }
00124
00125
00126 template <typename CorbaSequence, typename List>
00127 inline List copyCorbaToStdCollection(const CorbaSequence * thisSeq) {
00128 List result;
00129
00130 if (thisSeq) {
00131 for(unsigned int i=0; i<thisSeq->length(); i++) {
00132 result.push_back((*thisSeq)[i]);
00133 }
00134 }
00135 return result;
00136 }
00137
00138
00139 template <typename CorbaSequence, typename ArrayMember>
00140 inline CorbaSequence *copyArrayToCorba(ArrayMember * const array, const unsigned long length) {
00141 CorbaSequence *result = new CorbaSequence(length);
00142 result->length(length);
00143
00144 if(array) {
00145 for(unsigned long i=0; i<length; i++) {
00146 (*result)[i]=array[i];
00147 }
00148 }
00149 return result;
00150 }
00151
00152 template <typename CorbaSequence, typename ArrayMember>
00153 inline CorbaSequence *copyVectorToCorba(const std::vector<ArrayMember> & array) {
00154 CorbaSequence *result;
00155 unsigned size = array.size();
00156 result = new CorbaSequence(size);
00157 result->length(size);
00158
00159 for(unsigned long i=0; i<array.size(); i++) {
00160 (*result)[i]=array[i];
00161 }
00162 return result;
00163 }
00164
00165 template <typename CorbaMatrix, typename CorbaSequence, typename ArrayMember>
00166 inline CorbaMatrix *copyVectorVectorToCorba(const std::vector<std::vector<ArrayMember> > & matrix) {
00167 unsigned int size = matrix.size();
00168 CorbaMatrix *result = new CorbaMatrix(size);
00169 result->length(size);
00170
00171 for(unsigned long i=0; i<size; i++) {
00172 unsigned int width=matrix[i].size();
00173 CorbaSequence *seq = new CorbaSequence(width);
00174 seq->length(width);
00175 for(unsigned long j=0; j<width; j++) {
00176 (*seq)[j] = matrix[i][j];
00177 }
00178 (*result)[i]=*seq;
00179 }
00180 return result;
00181 }
00182
00183 template <typename CorbaBlock, typename ArrayMember>
00184 inline ArrayMember *copyCorbaToArray(const CorbaBlock & thisSeq, ArrayMember * const array) {
00185 for(unsigned int i=0; i<thisSeq.length(); i++) {
00186 array[i] = thisSeq[i];
00187 }
00188 return array;
00189 }
00190
00191 }
00192
00193 #endif //SCT_OMNIMARSHALLING_H