OpenMesh
OpenMesh/Apps/Decimating/CmdOption.hh
00001 /*===========================================================================*\
00002  *                                                                           *
00003  *                               OpenMesh                                    *
00004  *      Copyright (C) 2001-2011 by Computer Graphics Group, RWTH Aachen      *
00005  *                           www.openmesh.org                                *
00006  *                                                                           *
00007  *---------------------------------------------------------------------------* 
00008  *  This file is part of OpenMesh.                                           *
00009  *                                                                           *
00010  *  OpenMesh is free software: you can redistribute it and/or modify         * 
00011  *  it under the terms of the GNU Lesser General Public License as           *
00012  *  published by the Free Software Foundation, either version 3 of           *
00013  *  the License, or (at your option) any later version with the              *
00014  *  following exceptions:                                                    *
00015  *                                                                           *
00016  *  If other files instantiate templates or use macros                       *
00017  *  or inline functions from this file, or you compile this file and         *
00018  *  link it with other files to produce an executable, this file does        *
00019  *  not by itself cause the resulting executable to be covered by the        *
00020  *  GNU Lesser General Public License. This exception does not however       *
00021  *  invalidate any other reasons why the executable file might be            *
00022  *  covered by the GNU Lesser General Public License.                        *
00023  *                                                                           *
00024  *  OpenMesh is distributed in the hope that it will be useful,              *
00025  *  but WITHOUT ANY WARRANTY; without even the implied warranty of           *
00026  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            *
00027  *  GNU Lesser General Public License for more details.                      *
00028  *                                                                           *
00029  *  You should have received a copy of the GNU LesserGeneral Public          *
00030  *  License along with OpenMesh.  If not,                                    *
00031  *  see <http://www.gnu.org/licenses/>.                                      *
00032  *                                                                           *
00033 \*===========================================================================*/ 
00034 
00035 /*===========================================================================*\
00036  *                                                                           *             
00037  *   $Revision: 492 $                                                         *
00038  *   $Date: 2012-01-13 10:04:40 +0100 (Fr, 13 Jan 2012) $                   *
00039  *                                                                           *
00040 \*===========================================================================*/
00041 
00042 #ifndef CMDOPTION
00043 #define CMDOPTION
00044 
00045 template <typename T>
00046 class CmdOption
00047 {
00048 public:
00049 
00050   typedef T value_type;
00051 
00052   CmdOption(const T& _val) : val_(_val), valid_(true), enabled_(false) { }
00053   CmdOption() : val_(T()),valid_(false), enabled_(false) { }
00054 
00055   // has been set and has a value
00056   bool is_valid(void) const   { return valid_;   }
00057   bool has_value(void) const  { return is_valid(); }
00058 
00059   // has been set and may have an value (check with is_valid())
00060   bool is_enabled() const { return enabled_; }
00061 
00062   void enable() { enabled_ = true; }
00063 
00064   CmdOption& operator = ( const T& _val ) 
00065   { 
00066     val_ = _val;
00067     valid_=true; 
00068     enable();
00069     return *this; 
00070   }
00071 
00072   operator T  () const { return val_; }
00073   //  operator const T& () const { return val_; }
00074 
00075   operator T* () const  { return is_valid() ? &val_ : NULL; }
00076 
00077 private:
00078 
00079   T    val_;
00080   bool valid_;
00081   bool enabled_;
00082 
00083 private: // non-copyable
00084   
00085   CmdOption(const CmdOption&);
00086   CmdOption& operator = ( const CmdOption& );
00087 
00088 };
00089 
00090 template < typename T >
00091 std::ostream& operator << ( std::ostream& _os, CmdOption<T>& _opt )
00092 {
00093   _os << (T&)_opt;
00094   return _os;
00095 }
00096 
00097 #endif