00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #include "Message/Message.h"
00028 #include "Utility/Inform.h"
00029 #include "Utility/IpplInfo.h"
00030 #include "Profile/Profiler.h"
00031
00032 #ifdef IPPL_STDSTL
00033
00034 #include <iterator>
00035
00036
00037
00038 #ifdef OLD_IPPL_PGI
00039 namespace std {
00040
00041 template <class _Iterator>
00042 struct iterator_traits {
00043 typedef typename _Iterator::iterator_category iterator_category;
00044 typedef typename _Iterator::value_type value_type;
00045 typedef typename _Iterator::difference_type difference_type;
00046 typedef typename _Iterator::pointer pointer;
00047 typedef typename _Iterator::reference reference;
00048 };
00049
00050 template <class _Tp>
00051 struct iterator_traits<_Tp*> {
00052 typedef random_access_iterator_tag iterator_category;
00053 typedef _Tp value_type;
00054 typedef ptrdiff_t difference_type;
00055 typedef _Tp* pointer;
00056 typedef _Tp& reference;
00057 };
00058
00059 template <class _Tp>
00060 struct iterator_traits<const _Tp*> {
00061 typedef random_access_iterator_tag iterator_category;
00062 typedef _Tp value_type;
00063 typedef ptrdiff_t difference_type;
00064 typedef const _Tp* pointer;
00065 typedef const _Tp& reference;
00066 };
00067
00068 }
00069 #endif // IPPL_PGI
00070 using namespace std;
00071
00072 #else
00073
00074 #include <iterator.h>
00075
00076 #endif
00077
00078 #ifdef IPPL_USE_STANDARD_HEADERS
00079 #include <new>
00080 #include <memory>
00081 using namespace std;
00082 #else
00083 #include <new.h>
00084 #include <memory.h>
00085 #endif
00086
00087 #include <stdlib.h>
00088 #include <stddef.h>
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099 template <class T>
00100 Message&
00101 PutSingleItem<T, false, false>::put(Message& msg, const T& cvalue)
00102 {
00103 T& value = const_cast<T&>(cvalue);
00104 value.putMessage(msg);
00105 return msg;
00106 }
00107
00108 template <class T>
00109 Message&
00110 PutSingleItem<T, false, false>::get(Message& msg, T& value)
00111 {
00112 value.getMessage(msg);
00113 return msg;
00114 }
00115
00116 template <class T>
00117 Message&
00118 PutSingleItem<T, false, false>::put(Message& m, T beg, T end)
00119 {
00120
00121 typedef typename iterator_traits<T>::value_type T2;
00122
00123
00124 if (beg == end) {
00125 m.putmsg(0, sizeof(T2), 0);
00126 }
00127 else {
00128
00129 unsigned int d = 0;
00130 T f;
00131 for (f = beg; f != end; ++d, ++f);
00132
00133
00134
00135
00136 if (!m.willCopy()) {
00137 #ifdef __MWERKS__
00138 m.putmsg((void*) (&*beg), sizeof(T2), d);
00139 #else
00140
00141 m.putmsg((void*) (&*beg), sizeof(T2), d);
00142
00143 #endif // __MWERKS__
00144 }
00145 else {
00146
00147
00148 T2* cpydata = static_cast<T2*>( malloc(sizeof(T2) * d) );
00149 T2* cpy = cpydata;
00150 T i;
00151 for (i = beg; i != end; ++i, ++cpy)
00152 new (cpy) T2(*i);
00153
00154
00155 m.setCopy(false);
00156 m.setDelete(true);
00157 m.putmsg( (void*) cpydata, sizeof(T2), d );
00158 }
00159 }
00160 return m;
00161 }
00162
00163 template <class T>
00164 Message&
00165 PutSingleItem<T, false, false>::put(Message& m,
00166 const vector<size_t>& indices, T beg)
00167 {
00168
00169 typedef typename iterator_traits<T>::value_type T2;
00170
00171
00172 if (indices.begin() == indices.end()) {
00173 m.putmsg(0, sizeof(T2), 0);
00174 }
00175 else {
00176
00177 vector<size_t>::size_type d = indices.size();
00178
00179
00180
00181 T2* cpydata = static_cast<T2*>( malloc(sizeof(T2) * d) );
00182 T2* cpy = cpydata;
00183 vector<size_t>::const_iterator i, iend = indices.end();
00184 for (i = indices.begin(); i != iend; ++i, ++cpy)
00185 new (cpy) T2(beg[*i]);
00186
00187
00188 m.setCopy(false);
00189 m.setDelete(true);
00190 m.putmsg( (void*) cpydata, sizeof(T2), d );
00191 }
00192 return m;
00193 }
00194
00195 template <class T>
00196 Message&
00197 PutSingleItem<T, false, false>::get_iter(Message& m, T o)
00198 {
00199
00200 typedef typename iterator_traits<T>::value_type T2;
00201
00202
00203 if ( m.empty() ) {
00204 ERRORMSG("get_iter(): no more items in Message" << endl);
00205 }
00206 else {
00207
00208 Message::MsgItem& mitem = m.item(0);
00209
00210
00211 T2* data = static_cast<T2*>( mitem.data() );
00212 int i;
00213 for (i = mitem.numElems(); i > 0; i--)
00214 *o++ = *data++;
00215
00216
00217 m.get();
00218 }
00219 return m;
00220 }
00221
00222
00223
00224
00225 template <class T>
00226 Message&
00227 PutSingleItem<T, true, false>::put(Message& msg, const T& value)
00228 {
00229 T& ncval = const_cast<T&>(value);
00230 return msg.putmsg( (void*) &ncval, sizeof(T) );
00231 }
00232
00233 template <class T>
00234 Message&
00235 PutSingleItem<T, true, false>::get(Message& msg, T& value)
00236 {
00237 return msg.getmsg( (void*) &value );
00238 }
00239
00240
00241
00242
00243
00244
00245 template <class T>
00246 Message&
00247 PutSingleItem<T, true, true>::put(Message& msg, T beg, T end)
00248 {
00249 typedef typename iterator_traits<T>::value_type value_type;
00250 return msg.putmsg( (void*) beg,
00251 sizeof(value_type),
00252 (end - beg) );
00253 }
00254
00255 template <class T>
00256 Message&
00257 PutSingleItem<T, true, true>::get(Message& msg, T ptr)
00258 {
00259 return msg.getmsg( (void*) ptr );
00260 }
00261
00262 template <class T>
00263 Message&
00264 PutSingleItem<T, true, true>::put(Message& m,
00265 const vector<size_t>& indices, T beg)
00266 {
00267 return PutSingleItem<T, false, false>::put(m, indices, beg);
00268 }
00269
00270 template <class T>
00271 Message&
00272 PutSingleItem<T, true, true>::get_iter(Message& m, T o)
00273 {
00274 return PutSingleItem<T, false, false>::get_iter(m, o);
00275 }
00276
00277
00278
00279
00280
00281
00282