/*
 Copyright (C) 2000-2004

 Code contributed by Greg Collecutt, Joseph Hope and Paul Cochrane

 This file is part of xmds.
 
 This program is free software; you can redistribute it and/or
 modify it under the terms of the GNU General Public License
 as published by the Free Software Foundation; either version 2
 of the License, or (at your option) any later version.

 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.

 You should have received a copy of the GNU General Public License
 along with this program; if not, write to the Free Software
 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
*/

/*
  $Id: xmdsutils.h,v 1.14 2004/07/13 06:16:49 paultcochrane Exp $
*/

/*! @file xmdsutils.h
  @brief Header for various xmds utility classes
*/


#ifndef LIST
#include<list>
#define LIST
#endif

// ******************************************************************************
// ******************************************************************************
//                              xmdsException
// ******************************************************************************
// ******************************************************************************

//! xmdsException class
class xmdsException {

public :

  //! Constructor of xmdsException object
  xmdsException();

  //! Constructor of xmdsException object
  xmdsException(
      		const char *const yourErrorMessage);

  //! Constructor of xmdsException object
  xmdsException(
      		const Node *const yourNode,
      		const char *const yourErrorMessage);
    
  //! Gets xmds error
  const char* getError();

private :

  char                  s[2048];        //!< Character array to hold a temporary string, probably some version of the error text
  const Node *const	myNode;         //!< The current node
  const char *const	myErrorMessage; //!< The error message to print
};

// ******************************************************************************
// ******************************************************************************
//                              domain
// ******************************************************************************
// ******************************************************************************

//! Structure defining the beginning and the end of an xmds simulation (I think)
struct domainStruct {

  double begin;  //!< Beginning of domain
  double end;    //!< End of domain
};

// ******************************************************************************
// ******************************************************************************
//                              xmdsUtility
// ******************************************************************************
// ******************************************************************************

//! xmdsUtility class
class xmdsUtility {

public :

  //! Constructor of xmdsUtility object
  xmdsUtility();

  //! Destructor
  virtual ~xmdsUtility();

  //! Processes the element yourElement
  virtual void processElement(
			      const Element *const yourElement) = 0;

  enum {
    REQD = 1,
    NOT_REQD = 0,
    DEEP = 1,
    NOT_DEEP = 0
  };

protected :

  //! Returns the error message
  char* errorMessage() const;

  //! Gets the assignment strings
  void getAssignmentStrings(
			    const Element *const inElement,
			    const XMLString& ofName,
			    const bool& required,
			    const unsigned long& n2get,
			    list<XMLString>&  outList);

  //! Gets the assignment booleans
  void getAssignmentBools(
			  const Element *const inElement,
			  const XMLString& ofName,
			  const bool& required,
			  const unsigned long& n2get,
			  list<bool>&  outList);

  //! Gets the assignment unsigned longs
  void getAssignmentULongs(
			   const Element *const inElement,
			   const XMLString& ofName,
			   const bool& required,
			   const unsigned long& n2get,
			   list<unsigned long>&  outList);

  //! Gets the assignment doubles
  void getAssignmentDoubles(
			    const Element *const inElement,
			    const XMLString& ofName,
			    const bool& required,
			    const unsigned long& n2get,
			    list<double>&  outList);

  //! Gets the assignment domains
  void getAssignmentDomains(
			    const Element *const inElement,
			    const XMLString& ofName,
			    const bool& required,
			    const unsigned long& n2get,
			    list<domainStruct>&  outList);

  //! Gets the attribute strings
  void getAttributeStrings(
			   const Element *const inElement,
			   const XMLString& ofElementName,
			   const XMLString& ofAttrName,
			   const bool& required,
			   XMLString& outString);

  //! Gets the attribute booleans
  void getAttributeBools(
			 const Element *const inElement,
			 const XMLString& ofElementName,
			 const XMLString& ofAttrName,
			 const bool& required,
			 bool& outBool);
  
  //! Converts a space list to unsigned long
  unsigned long spaceList2ULong(
				const list<bool>& spaceList) const;

private :

  mutable char myErrorMessage[2048]; //!< Error message string

  //! Parse an XML string inString at node inNode generating the output XML string list outXMLStringList
  void parseXMLString(
		      const Node *const inNode,
		      const XMLString *const inString,
		      list<XMLString>& outXMLStringList);
};



syntax highlighted by Code2HTML, v. 0.9.1