sprint 1-alpha
|
00001 /****************************************************************************** 00002 * sprint::ref_any 00003 * 00004 * Copyright (C) 2005-2011 Paolo Medici <www.pmx.it> 00005 * 00006 * This library is free software; you can redistribute it and/or 00007 * modify it under the terms of the GNU Lesser General Public 00008 * License as published by the Free Software Foundation; either 00009 * version 2.1 of the License, or (at your option) any later version. 00010 * 00011 * This library is distributed in the hope that it will be useful, 00012 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00014 * Lesser General Public License for more details. 00015 * 00016 * You should have received a copy of the GNU Lesser General Public 00017 * License along with this library; if not, write to the Free Software 00018 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 00019 * 00020 *******************************************************************************/ 00021 00022 #ifndef _SPRINT_REF_ANY_H 00023 #define _SPRINT_REF_ANY_H 00024 00028 #include <sprint/serializable_rtti.h> 00029 00030 namespace sprint { 00031 00040 struct ref_any { 00041 Type type; 00042 void *mem; 00043 unsigned int size; 00044 00046 template<class T> 00047 inline ref_any(T *p) 00048 { type = rtti<T>(), mem = reinterpret_cast<void *>(p), size = sizeof(p); } 00049 00051 template<class T> 00052 inline ref_any(T *p, int len) 00053 { 00054 type = rtti<T *>(), mem = reinterpret_cast<void *>(p), size = len * sizeof(T); 00055 } 00056 00057 // check without exception 00058 template<class T> 00059 inline bool is() const { 00060 return (rtti<T>() == type); 00061 } 00062 00063 // cast container to T without check 00064 template<class T> 00065 inline T get() const 00066 { 00067 return *reinterpret_cast<T*>(mem); 00068 } 00069 00070 // cast container to T without check 00071 template<class T> 00072 inline void set(const T & s) const 00073 { 00074 *reinterpret_cast<T*>(mem) = s; 00075 } 00076 00077 }; 00078 00079 }; 00080 00081 #endif