sprint 1-alpha
sprint/container/ref.h
Go to the documentation of this file.
00001 /******************************************************************************
00002 *   sprint::container::ref
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_H
00023 #define _SPRINT_REF_H
00024 
00028 namespace sprint {
00029           
00030           namespace detail {
00031 
00033           template<class T>
00034           class ref {
00035                 T & m_ptr;
00036                 public:
00037                 ref(T & ptr) : m_ptr(ptr) { }
00038                 
00039                 T * operator ->() { return &m_ptr; }
00040                 const T * operator ->() const { return &m_ptr; }
00041                 T & operator *() { return m_ptr; }
00042                 const T & operator *() const { return m_ptr; }
00043 
00044                 operator T& () const  { return m_ptr; }
00045 
00046                 };
00047 
00049           template<class T>
00050           class const_ref {
00051                 const T & m_ptr;
00052                 public:
00053                 const_ref(const T & ptr) : m_ptr(ptr) { }
00054                 
00055                 const T * operator ->() const { return &m_ptr; }
00056                 const T & operator *() const { return m_ptr; }
00057                 
00058                 operator T& () const { return m_ptr; }
00059                 };
00060 
00061           } // detail
00062           
00064           template<class T>
00065           inline sprint::detail::const_ref<T> ref(const T & ptr)
00066                           {
00067                           return sprint::detail::const_ref<T>(ptr);
00068                           }
00069           
00071           template<class T>
00072           inline sprint::detail::ref<T> ref(T & ptr)
00073                           {
00074                           return sprint::detail::ref<T>(ptr);
00075                           }
00076           
00077           };
00078 
00079 #endif
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Defines