text: /*=========================================================================
  
    Program:   Visualization Toolkit
    Module:    vtkBlueObeliskDataParser.h
  
    Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
    All rights reserved.
    See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
  
       This software is distributed WITHOUT ANY WARRANTY; without even
       the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
       PURPOSE.  See the above copyright notice for more information.
  
  =========================================================================*/
  /**
   * @class   vtkBlueObeliskDataParser
   * @brief   Fill a vtkBlueObeliskData
   * container with data from the BODR XML dataset.
   *
   *
   * The Blue Obelisk Data Repository is a free, open repository of
   * chemical information. This class extracts the BODR information into
   * vtk arrays, which are stored in a vtkBlueObeliskData object.
   *
   * \warning The vtkBlueObeliskDataParser class should never need to be
   * used directly. For convenient access to the BODR data, use
   * vtkPeriodicTable. For access to the raw arrays produced by this
   * parser, see the vtkBlueObeliskData class. A static
   * vtkBlueObeliskData object is accessible via
   * vtkPeriodicTable::GetBlueObeliskData().
   *
   * @sa
   * vtkPeriodicTable vtkBlueObeliskData
   */
  
  #ifndef vtkBlueObeliskDataParser_h
  #define vtkBlueObeliskDataParser_h
  
  #include "vtkDomainsChemistryModule.h" // For export macro
  #include "vtkXMLParser.h"
  
  #include "vtkSmartPointer.h" // For vtkSmartPointer
  
  class vtkAbstractArray;
  class vtkBlueObeliskData;
  class vtkFloatArray;
  class vtkStdString;
  class vtkStringArray;
  class vtkUnsignedShortArray;
  
  class VTKDOMAINSCHEMISTRY_EXPORT vtkBlueObeliskDataParser : public vtkXMLParser
  {
  public:
    vtkTypeMacro(vtkBlueObeliskDataParser, vtkXMLParser);
    void PrintSelf(ostream& os, vtkIndent indent) override;
  
    static vtkBlueObeliskDataParser* New();
  
    /**
     * Set the target vtkBlueObeliskData object that this parser will
     * populate
     */
    virtual void SetTarget(vtkBlueObeliskData* bodr);
  
    /**
     * Start parsing
     */
    int Parse() override;
  
    //@{
    /**
     * These are only implemented to prevent compiler warnings about hidden
     * virtual overloads. This function simply call Parse(); the arguments are
     * ignored.
     */
    int Parse(const char*) override;
    int Parse(const char*, unsigned int) override;
    //@}
  
  protected:
    vtkBlueObeliskDataParser();
    ~vtkBlueObeliskDataParser() override;
  
    void StartElement(const char* name, const char** attr) override;
    void EndElement(const char* name) override;
  
    void CharacterDataHandler(const char* data, int length) override;
  
    void SetCurrentValue(const char* data, int length);
    void SetCurrentValue(const char* data);
  
    vtkBlueObeliskData* Target;
  
    bool IsProcessingAtom;
    void NewAtomStarted(const char** attr);
    void NewAtomFinished();
  
    bool IsProcessingValue;
    void NewValueStarted(const char** attr);
    void NewValueFinished();
  
    std::string CharacterDataValueBuffer;
  
    enum AtomValueType
    {
      None = 0,
      AtomicNumber,
      Symbol,
      Name,
      PeriodicTableBlock,
      ElectronicConfiguration,
      Family,
      Mass,
      ExactMass,
      IonizationEnergy,
      ElectronAffinity,
      PaulingElectronegativity,
      CovalentRadius,
      VDWRadius,
      DefaultColor,
      BoilingPoint,
      MeltingPoint,
      Period,
      Group
    } CurrentValueType;
  
    int CurrentAtomicNumber;
    vtkStdString* CurrentSymbol;
    vtkStdString* CurrentName;
    vtkStdString* CurrentPeriodicTableBlock;
    vtkStdString* CurrentElectronicConfiguration;
    vtkStdString* CurrentFamily;
    float CurrentMass;
    float CurrentExactMass;
    float CurrentIonizationEnergy;
    float CurrentElectronAffinity;
    float CurrentPaulingElectronegativity;
    float CurrentCovalentRadius;
    float CurrentVDWRadius;
    float CurrentDefaultColor[3];
    float CurrentBoilingPoint;
    float CurrentMeltingPoint;
    unsigned int CurrentPeriod;
    unsigned int CurrentGroup;
  
  private:
    vtkBlueObeliskDataParser(const vtkBlueObeliskDataParser&) = delete;
    void operator=(const vtkBlueObeliskDataParser&) = delete;
  
    //@{
    /**
     * Resize array if needed and set the entry at ind to val.
     */
    static void ResizeArrayIfNeeded(vtkAbstractArray* arr, vtkIdType ind);
    static void ResizeAndSetValue(vtkStdString* val, vtkStringArray* arr, vtkIdType ind);
    static void ResizeAndSetValue(float val, vtkFloatArray* arr, vtkIdType ind);
    static void ResizeAndSetValue(unsigned short val, vtkUnsignedShortArray* arr, vtkIdType ind);
    //@}
  
    //@{
    /**
     * Parse types from const char *
     */
    static int parseInt(const char*);
    static float parseFloat(const char*);
    static void parseFloat3(const char* str, float[3]);
    static unsigned short parseUnsignedShort(const char*);
    //@}
  
    //@{
    /**
     * Convert a string to lower case. This will modify the input string
     * and return the input pointer.
     */
    static vtkStdString* ToLower(vtkStdString*);
    //@}
  };
  
  #endif
  