       // typedefs to STL container used internally
          typedef rose_hash_multimap BaseHashType;
          typedef BaseHashType::iterator hash_iterator;

       // Constructors
          SgSymbolTable();
          SgSymbolTable(int sz);

       // Destructors are automatically generated by ROSETTA and so should not be explicitly represented
      // ~SgSymbolTable();

       // General function used to build AST
          void insert ( const SgName &, SgSymbol *sp );

       // DQ (1/31/2007): Depricated (is not well named and should return bool)
          int  find   ( const SgName &, SgSymbol *sp ) ROSE_DEPRECATED_FUNCTION;

       // DQ (1/31/2007): New functions that will replace the depricated find() member function
          bool exists ( const SgName &, SgSymbol *sp );
          bool exists ( const SgName & );
          bool exists ( SgSymbol *sp );

       // DQ (1/30/2007): Added general remove function for an explicitly identified SgSymbol
          void remove ( const SgSymbol* symbol );

       // DQ (1/30/2007): Added general remove functions for all SgSymbol IR nodes.
       // This function will remove all symbols with the specified name (even ones of
       // different typese, see rest of comment).
       // This function is a bit dangerous except for function types since the only for the 
       // function type table are the names unique.  For non-function type symbol 
       // tables classes and typedefs can have the same name (e.g. "typedef struct X {} X;")
       // so removing the name might have unexpected results! 
          void remove ( const SgName & );

       // DQ (1/30/2007): Added remove functions for each sort of SgSymbol IR node
          void remove_function      ( const SgName & );
          void remove_class         ( const SgName & );
          void remove_enum          ( const SgName & );
          void remove_typedef       ( const SgName & );
          void remove_label         ( const SgName & );
          void remove_var           ( const SgName & );
          void remove_enum_field    ( const SgName & );
          void remove_function_type ( const SgName & );
          void remove_namespace     ( const SgName & );

       // Used by SgScopeStatement::lookup_symbol(const SgName& n)
          SgSymbol* findany(const SgName &);

       // Used only for global function type table
          SgFunctionTypeSymbol* findfunctype(const SgName&) const;

       // Used by Qing's AST Interface code
          SgVariableSymbol*  findvar(const SgName &) ROSE_DEPRECATED_FUNCTION;
          SgClassSymbol*     findclass(const SgName &) ROSE_DEPRECATED_FUNCTION;
          SgFunctionSymbol*  findfunc(const SgName&) ROSE_DEPRECATED_FUNCTION;
          SgFunctionSymbol*  findfunc(const SgName&, const SgType*) ROSE_DEPRECATED_FUNCTION;

       // DQ (1/30/2007): New interface member functions using name
          SgVariableSymbol*  find_var(const SgName &);
          SgClassSymbol*     find_class(const SgName &);
          SgFunctionSymbol*  find_function(const SgName&);
          SgFunctionSymbol*  find_function_type(const SgName&, const SgType*);

       // Additional find functions (using name)
          SgTypedefSymbol*   find_typedef(const SgName &);
          SgEnumSymbol*      find_enum(const SgName &);
          SgEnumFieldSymbol* find_enumfield(const SgName &);
          SgLabelSymbol*     find_label(const SgName &) const;
          SgNamespaceSymbol* find_namespace(const SgName &);

          SgSymbol*          findfirstany() ROSE_DEPRECATED_FUNCTION;
          SgVariableSymbol*  findfirstvar() ROSE_DEPRECATED_FUNCTION;
          SgClassSymbol*     findfirstclass() ROSE_DEPRECATED_FUNCTION;
          SgFunctionSymbol*  findfirstfunction() ROSE_DEPRECATED_FUNCTION;

       // DQ (1/30/2007): New interface member functions: get the first symbol using type of SgSymbol
          SgSymbol*          find_any();
          SgVariableSymbol*  find_var();
          SgClassSymbol*     find_class();
          SgFunctionSymbol*  find_function();
          SgFunctionSymbol*  find_function_type();
          SgTypedefSymbol*   find_typedef();
          SgEnumSymbol*      find_enum();
          SgEnumFieldSymbol* find_enumfield();
          SgLabelSymbol*     find_label();
          SgNamespaceSymbol* find_namespace();

          SgSymbol*          nextany() ROSE_DEPRECATED_FUNCTION;
          SgVariableSymbol*  nextvar() ROSE_DEPRECATED_FUNCTION;
          SgClassSymbol*     nextclass() ROSE_DEPRECATED_FUNCTION;

       // Get the next symbol of a specific type, return NULL if not available.
       // These functions use state information set by the find functions (either
       // the versions using the name or not using a name as a parameter).
          SgSymbol*          next_any();
          SgVariableSymbol*  next_var();
          SgClassSymbol*     next_class();
          SgTypedefSymbol*   next_typedef();
          SgEnumSymbol*      next_enum();
          SgEnumFieldSymbol* next_enumfield();
          SgLabelSymbol*     next_label();
          SgNamespaceSymbol* next_namespace();

       // for both global function and member functions
          SgFunctionSymbol*  nextfunc();

#if 0
       // DQ (9/7/2006): Previously removed functionality, restored by request from Beata at ANL.
       // The next for functions have been placed back into the Sage III interface.
          SgVariableSymbol*  findfirstvar();
          SgVariableSymbol*  nextvar();
          SgSymbol*          nextany();
          SgSymbol*          findfirstany();
#endif
       // This is a cute operator to use, but since it can't specify a type of SgSymbol it is not so useful in practice.
          SgSymbol* operator[](const SgName &);

          int count(const SgName &) const;
          void print(std::ostream&);
          void print( std::string label );
          int size() const;
