optionfile.h

Go to the documentation of this file.
00001 /**
00002 \file    OptionFile.h 
00003 \brief   A class for handling option files. \n
00004          ';' delimits a comment to follow. \n
00005          The general format is: \n
00006          field, comment = value ; comment \n
00007          e.g. \n
00008          ; A data value will follow this comment \n
00009          DataValue, (some comment about it) = 88 ; another comment here \n
00010 
00011 \author  Glenn D. MacGougan (GDM)
00012 \date    2007-11-28
00013 \since   2006-12-07
00014 
00015 \b "LICENSE INFORMATION" \n
00016 Copyright (c) 2007, refer to 'author' doxygen tags \n
00017 All rights reserved. \n
00018 
00019 Redistribution and use in source and binary forms, with or without
00020 modification, are permitted provided the following conditions are met: \n
00021 
00022 - Redistributions of source code must retain the above copyright
00023   notice, this list of conditions and the following disclaimer. \n
00024 - Redistributions in binary form must reproduce the above copyright
00025   notice, this list of conditions and the following disclaimer in the
00026   documentation and/or other materials provided with the distribution. \n
00027 - The name(s) of the contributor(s) may not be used to endorse or promote 
00028   products derived from this software without specific prior written 
00029   permission. \n
00030 
00031 THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS ``AS IS'' AND ANY EXPRESS 
00032 OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
00033 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
00034 DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
00035 INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
00036 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 
00037 SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 
00038 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
00039 LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 
00040 OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 
00041 SUCH DAMAGE.
00042 */
00043 
00044 #ifndef _OPTIONFILE_H_
00045 #define _OPTIONFILE_H_
00046 
00047 #include <string> // using std::string
00048 
00049 ///  \brief   A class for handling option files. 
00050 ///           ';' delimits a comment to follow. \n
00051 ///           The general format is: \n
00052 ///           field, comment = value ; comment \n
00053 ///
00054 class OptionFile
00055 {
00056 protected: // Encapsulated Types
00057 
00058   typedef struct
00059   {
00060     std::string Field;
00061     std::string Comment;
00062     std::string Value;
00063     std::string PostValueComment;
00064   } stOption;
00065 
00066 
00067 public: // Lifecycle
00068 
00069   /// \brief    OptionFile destructor
00070   virtual ~OptionFile(); 
00071 
00072   /// \brief    The default constructor.
00073   OptionFile();
00074 
00075   /// \brief    The disabled copy constructor.
00076   OptionFile( OptionFile& rhs ) {} ;
00077 
00078 
00079 public: 
00080 
00081   /// \brief    Reads in the options
00082   /// \return   true if successful, false otherwise
00083   bool ReadOptionFile( const std::string OptionFilePath );
00084 
00085   /// \brief    Get data from a field
00086   /// \return   true if successful, false otherwise.
00087   bool GetValue( const std::string Field, std::string &Value );
00088 
00089   /// \brief    Get data from a field
00090   /// \return   true if successful, false otherwise.    
00091   bool GetValue( const std::string Field, double &value );
00092 
00093   /// \brief    Get data from a field
00094   /// \return   true if successful, false otherwise.    
00095   bool GetValue( const std::string Field, float  &value );
00096 
00097   /// \brief    Get data from a field
00098   /// \return   true if successful, false otherwise.
00099   bool GetValue( const std::string Field, short  &value );
00100 
00101   /// \brief    Get data from a field
00102   /// \return   true if successful, false otherwise.    
00103   bool GetValue( const std::string Field, unsigned short &value );
00104 
00105   /// \brief    Get data from a field
00106   /// \return   true if successful, false otherwise.    
00107   bool GetValue( const std::string Field, int &value );
00108 
00109   /// \brief    Get data from a field
00110   /// \return   true if successful, false otherwise.    
00111   bool GetValue( const std::string Field, unsigned int &value );
00112 
00113   /// \brief    Get data from a field
00114   /// \return   true if successful, false otherwise.    
00115   bool GetValue( const std::string Field, bool &value );
00116 
00117   /// \brief    Get an array of integers up to a maximum number of items.
00118   /// \return   true if successful, false otherwise.    
00119   bool GetValueArray( 
00120     const std::string Field,      //!< The field identifier
00121     int *intArray,           //!< The pointer to the integer array.
00122     const unsigned maxItems, //!< The maximum number of elements in the array.
00123     unsigned &nrItems        //!< The number of valid items read into the array.
00124     );
00125 
00126   /// \brief    Get an array of double up to a maximum number of items.
00127   /// \return   true if successful, false otherwise.    
00128   bool GetValueArray( 
00129     const std::string Field,      //!< The field identifier
00130     double *dArray,          //!< The pointer to the integer array.
00131     const unsigned maxItems, //!< The maximum number of elements in the array.
00132     unsigned &nrItems        //!< The number of valid items read into the array.
00133     );
00134 
00135   /// \brief    Get a double value in degress from a Degree Minutes Seconds value
00136   bool GetDMSValue( const std::string Field, double &dms );
00137 
00138   /// \brief    Get the comment for the field specified.
00139   /// \return   true if successful, false otherwise.    
00140   bool GetComment( const std::string Field, std::string &Comment );
00141 
00142   /// \brief    Get the comment for the field specified present after the VALUE 
00143   ///           field. i.e. FIELD, COMMENT = VALUE ; POST-VALUE-COMMENT    
00144   /// \return   true if successful, false otherwise.        
00145   bool GetPostValueComment( const std::string Field, std::string &PostValueComment );
00146 
00147   /// \brief    Get the number of options available.
00148   /// \returns  The number of options.
00149   unsigned GetNumberOfOptions() { return m_nrOptions; }
00150 
00151 public: // Assignment
00152 
00153   /// \brief    Disabled operator= overload
00154   const OptionFile& operator=( const OptionFile& src ) {};
00155 
00156 
00157 protected: // Internal Implementation
00158 
00159   /// \return   true if file exists
00160   bool DoesFileExist( const std::string& OptionFilePath );
00161 
00162   /// \return   true if the find was successful, and the data was set
00163   bool FindField( 
00164     const std::string &Field, 
00165     std::string &Comment,
00166     std::string &Value,
00167     std::string &PostValueComment );
00168 
00169 protected: // Member Variables
00170 
00171   /// The array of options.
00172   stOption *m_Options;
00173 
00174   /// The number of valid options.
00175   unsigned m_nrOptions;
00176 
00177   /// The path to the option file.
00178   std::string m_OptionFilePathUsed;
00179 
00180 };
00181 
00182 
00183 #endif // _OPTIONFILE_H_