SundanceOrderedHandle.hpp
Go to the documentation of this file.
00001 /* @HEADER@ */
00002 // ************************************************************************
00003 // 
00004 //                             Sundance
00005 //                 Copyright 2011 Sandia Corporation
00006 // 
00007 // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
00008 // the U.S. Government retains certain rights in this software.
00009 //
00010 // Redistribution and use in source and binary forms, with or without
00011 // modification, are permitted provided that the following conditions are
00012 // met:
00013 //
00014 // 1. Redistributions of source code must retain the above copyright
00015 // notice, this list of conditions and the following disclaimer.
00016 //
00017 // 2. Redistributions in binary form must reproduce the above copyright
00018 // notice, this list of conditions and the following disclaimer in the
00019 // documentation and/or other materials provided with the distribution.
00020 //
00021 // 3. Neither the name of the Corporation nor the names of the
00022 // contributors may be used to endorse or promote products derived from
00023 // this software without specific prior written permission.
00024 //
00025 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
00026 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00027 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
00028 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
00029 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
00030 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
00031 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
00032 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
00033 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
00034 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
00035 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00036 //
00037 // Questions? Contact Kevin Long (kevin.long@ttu.edu)
00038 // 
00039 
00040 /* @HEADER@ */
00041 
00042 #ifndef SUNDANCEORDEREDHANDLE_HPP
00043 #define SUNDANCEORDEREDHANDLE_HPP
00044 
00045 #include "SundanceDefs.hpp"
00046 #include "PlayaHandle.hpp"
00047 #include <typeinfo>
00048 
00049 
00050 #define ORDERED_HANDLE_CTORS(handle, contents) \
00051 /** Empty ctor */ \
00052 handle() : OrderedHandle<contents >() {;} \
00053 /** Construct a #handle with a raw pointer to a #contents */ \
00054 handle(Playa::Handleable<contents >* rawPtr) : OrderedHandle<contents >(rawPtr) {;} \
00055 /** Construct a #handle with a smart pointer to a #contents */ \
00056 handle(const RCP<contents >& smartPtr) : OrderedHandle<contents >(smartPtr){;}
00057 
00058 
00059 
00060 
00061 namespace Sundance
00062 {
00063   using namespace Teuchos;
00064 
00065   /**
00066    * Class OrderedHandle is an extension to Playa::Handle that 
00067    * includes a comparison operator ("<" operator) so that
00068    * the handle can be used in ordered containers such as STL maps and sets.
00069    */
00070   template <class PointerType>
00071   class OrderedHandle : public Playa::Handle<PointerType>
00072   {
00073   public:
00074     /** empty ctor */
00075     OrderedHandle() : Playa::Handle<PointerType>() {;}
00076 
00077     /** Construct from a raw ptr */
00078     OrderedHandle(Playa::Handleable<PointerType>* rawPtr) : Playa::Handle<PointerType>(rawPtr) {;}
00079 
00080     /** Construct from a smart ptr*/
00081     OrderedHandle(const RCP<PointerType>& smartPtr) 
00082       : Playa::Handle<PointerType>(smartPtr) {;}
00083 
00084     /** comparison operator */
00085     bool operator<(const OrderedHandle<PointerType>& other) const 
00086     {
00087       /* first compare types */
00088       const PointerType* me = this->ptr().get();
00089       const PointerType* you = other.ptr().get();
00090       if (me==0 && you==0) 
00091         {
00092           return false;
00093         }
00094       if (me==0) 
00095         {
00096           return true;
00097         }
00098       if (you==0) 
00099         {
00100           return false;
00101         }
00102 
00103       if (typeid(*me).before(typeid(*you))) 
00104         {
00105           return true;
00106         }
00107 
00108       if (typeid(*you).before(typeid(*me)))
00109         {
00110           return false;
00111         }
00112       
00113       /* if the types are equal, compare values of the contents using
00114        * the lessThan() method. */
00115       bool rtn = this->ptr()->lessThan(other.ptr().get());
00116       return rtn;
00117     }
00118 
00119     /** */
00120     bool operator!=(const OrderedHandle<PointerType>& other) const
00121       {
00122         return (*this < other) || (other < *this);
00123       }
00124 
00125 
00126     /** */
00127     bool operator==(const OrderedHandle<PointerType>& other) const
00128       {
00129         return !(*this != other);
00130       }
00131 
00132     
00133   };
00134 }
00135 
00136 namespace std
00137 {
00138   /** \relates OrderedHandle */
00139   template <class P> inline 
00140   std::ostream& operator<<(std::ostream& os, 
00141                            const Sundance::OrderedHandle<P>& h)
00142   {
00143     h.print(os);
00144     return os;
00145   }
00146 }
00147 
00148 
00149 
00150 
00151 #endif
00152 

Site Contact