30 #ifndef DATA_HANDLE_TYPES 31 #define DATA_HANDLE_TYPES 38 #include "sirf/iUtilities/LocalisedException.h" 40 #define NEW(T, X) T* X = new T 41 #define CAST_PTR(T, X, Y) T* X = (T*)Y 44 catch (LocalisedException& se) {\ 45 ExecutionStatus status(se);\ 46 DataHandle* handle = new DataHandle;\ 47 handle->set(0, &status);\ 48 return (void*)handle;\ 50 catch (std::string msg) {\ 51 ExecutionStatus status(msg.c_str(), __FILE__, __LINE__);\ 52 DataHandle* handle = new DataHandle;\ 53 handle->set(0, &status);\ 54 return (void*)handle;\ 56 catch (const std::exception &error) {\ 57 ExecutionStatus status(error.what(), __FILE__, __LINE__);\ 58 DataHandle* handle = new DataHandle;\ 59 handle->set(0, &status);\ 60 return (void*)handle;\ 63 ExecutionStatus status("unhandled", __FILE__, __LINE__);\ 64 DataHandle* handle = new DataHandle;\ 65 handle->set(0, &status);\ 66 return (void*)handle;\ 82 ExecutionStatus(
const std::string& error,
const std::string& file,
int line) {
83 set(error, file, line);
86 set(s.error(), s.file(), s.line());
89 set(ex.what(), ex.file(), ex.line());
92 const std::string& error()
const {
return _error; }
93 const std::string& file()
const {
return _file; }
94 int line()
const {
return _line; }
99 void set(
const std::string& error,
const std::string& file,
int line) {
117 DataHandle() : _data(0), _status(0), _owns_data(0) {}
119 if (_data && _owns_data)
123 static void* error_handle(
const std::string& error,
const std::string& file,
int line)
127 handle->set(0, &status);
130 void set(
void* data,
const ExecutionStatus* status = 0,
int grab = 0) {
135 if (_data && _owns_data)
138 _owns_data = grab != 0;
140 void set_status(
const std::string& error,
const std::string& file,
int line)
146 void* data()
const {
return _data; }
154 #if defined(USE_BOOST) 155 #include <boost/shared_ptr.hpp> 162 #if defined(USE_BOOST) 163 if (obj.uses_boost_sptr()) {
164 NEW(boost::shared_ptr<Base>, ptr_sptr);
165 *ptr_sptr = *(boost::shared_ptr<Base>*)obj.data();
166 _data = (
void*)ptr_sptr;
171 NEW(std::shared_ptr<Base>, ptr_sptr);
172 *ptr_sptr = *(std::shared_ptr<Base>*)obj.data();
173 _data = (
void*)ptr_sptr;
182 NEW(std::shared_ptr<Base>, ptr_sptr);
184 _data = (
void*)ptr_sptr;
190 #if defined(USE_BOOST) 193 NEW(boost::shared_ptr<Base>, ptr_sptr);
195 _data = (
void*)ptr_sptr;
205 #if defined(USE_BOOST) 207 CAST_PTR(boost::shared_ptr<Base>, ptr_sptr, _data);
213 CAST_PTR(std::shared_ptr<Base>, ptr_sptr, _data);
217 bool uses_boost_sptr()
const 225 template<
class Object>
227 newObjectHandle(std::shared_ptr<Object> sptr)
232 #if defined(USE_BOOST) 233 template<
class Object>
235 newObjectHandle(boost::shared_ptr<Object> sptr)
241 template<
class Object>
243 objectFromHandle(
const void* h) {
245 void* ptr = handle->data();
247 THROW(
"zero data pointer cannot be dereferenced");
248 #if defined(USE_BOOST) 249 if (handle->uses_boost_sptr()) {
250 CAST_PTR(boost::shared_ptr<Object>, ptr_sptr, ptr);
251 Object* ptr_obj = ptr_sptr->get();
253 THROW(
"zero object pointer cannot be dereferenced");
259 CAST_PTR(std::shared_ptr<Object>, ptr_sptr, ptr);
260 Object* ptr_obj = ptr_sptr->get();
262 THROW(
"zero object pointer cannot be dereferenced");
267 template<
class Object>
269 getObjectSptrFromHandle(
const void* h, std::shared_ptr<Object>& sptr) {
271 #if defined(USE_BOOST) 272 if (handle->uses_boost_sptr())
273 THROW(
"cannot cast boost::shared_ptr to std::shared_ptr");
275 void* ptr = handle->data();
277 THROW(
"zero data pointer cannot be dereferenced");
278 CAST_PTR(std::shared_ptr<Object>, ptr_sptr, ptr);
282 #if defined(USE_BOOST) 283 template<
class Object>
285 getObjectSptrFromHandle(
const void* h, boost::shared_ptr<Object>& sptr) {
287 if (!handle->uses_boost_sptr())
288 THROW(
"cannot cast std::shared_ptr to boost::shared_ptr");
289 void* ptr = handle->data();
291 THROW(
"zero data pointer cannot be dereferenced");
292 CAST_PTR(boost::shared_ptr<Object>, ptr_sptr, ptr);
307 template <
typename T>
311 T* ptr = (T*)malloc(
sizeof(T));
313 h->set((
void*)ptr, 0, GRAB);
322 template <
typename T>
327 setDataHandle<T>(h, x);
337 template <
typename T>
342 void* ptr_d = ptr_h->data();
351 inline char* charDataFromDataHandle(
const DataHandle* ptr_h)
353 void* ptr_d = ptr_h->data();
360 inline void* charDataHandleFromCharData(
const char* s)
363 size_t len = strlen(s);
364 char* d = (
char*)malloc(len + 1);
366 strcpy_s(d, len + 1, s);
370 h->set((
void*)d, 0, GRAB);
Definition: LocalisedException.h:32
std::vector< void const * > DataHandleVector
Typedef of vector of void pointers for a vector of handles.
Definition: DataHandle.h:70
Basic wrapper for C++ objects.
Definition: DataHandle.h:115
void setDataHandle(DataHandle *h, T x)
DataHandle wrapper.
Definition: DataHandle.h:309
T dataFromHandle(const void *ptr)
Data extractor.
Definition: DataHandle.h:339
Execution status type.
Definition: DataHandle.h:79
Definition: DataHandle.h:159
void * dataHandle(T x)
Data wrapper constructor.
Definition: DataHandle.h:324