00001 /*===========================================================================*\ 00002 * * 00003 * OpenMesh * 00004 * Copyright (C) 2001-2010 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: 325 $ * 00038 * $Date: 2010-06-17 12:45:58 +0200 (Do, 17 Jun 2010) $ * 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) { } 00053 CmdOption() : 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 () { return val_; } 00073 // operator const T& () const { return val_; } 00074 00075 operator T* () { 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