/**************************************************************************\
 * Copyright (c) Kongsberg Oil & Gas Technologies AS
 * All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
 * met:
 * 
 * Redistributions of source code must retain the above copyright notice,
 * this list of conditions and the following disclaimer.
 * 
 * Redistributions in binary form must reproduce the above copyright
 * notice, this list of conditions and the following disclaimer in the
 * documentation and/or other materials provided with the distribution.
 * 
 * Neither the name of the copyright holder nor the names of its
 * contributors may be used to endorse or promote products derived from
 * this software without specific prior written permission.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
\**************************************************************************/

/*!
  \page macros_nodes

  <h2>Node Macros</h2>

  - \ref SO_NODE_HEADER
  - \ref SO_NODE_ABSTRACT_HEADER
  - \ref SO_NODE_SOURCE
  - \ref SO_NODE_ABSTRACT_SOURCE
  - \ref SO_NODE_INIT_CLASS
  - \ref SO_NODE_INIT_ABSTRACT_CLASS
  - \ref SO_NODE_IS_FIRST_INSTANCE
  - \ref SO_NODE_CONSTRUCTOR
  - \ref SO_NODE_ADD_FIELD
  - \ref SO_NODE_DEFINE_ENUM_VALUE

  \ingroup macros
*/

#define SO_NODE_HEADER(classname)
/*!
  \def SO_NODE_HEADER(classname)

  This macro adds standard declarations needed in Coin nodes for
  object creation and type identification.

  \sa SO_NODE_SOURCE
  \ingroup nodes
*/

#define SO_NODE_ABSTRACT_HEADER(classname)
/*!
  \def SO_NODE_ABSTRACT_HEADER(classname)

  This macro adds standard declarations needed in Coin nodes for
  type identification.  It differs from \ref SO_NODE_HEADER in that
  the object creation part is omitted.

  \sa SO_NODE_ABSTRACT_SOURCE
  \ingroup nodes
*/

#define SO_NODE_INIT_CLASS(classname, parentclass, parentname)
/*!
  \def SO_NODE_INIT_CLASS(classname, parentclass, parentname)

  This macro is used in the initClass-function in a node class. It
  registers the class by name (by creating a new SoType for the
  class), so file reading will be able to create a node of this type
  and fill it with its field values.

  \sa SO_NODE_INIT_ABSTRACT_CLASS
  \ingroup nodes
*/

#define SO_NODE_INIT_ABSTRACT_CLASS(classname, parentclass, parentname)
/*!
  \def SO_NODE_INIT_ABSTRACT_CLASS(classname, parentclass, parentname)

  This macro is used in the initClass-function in abstract node classes.
  It registers the class by name (by creating a new SoType for the
  class) for type identification purposes.

  \sa SO_NODE_INIT_CLASS
  \ingroup nodes
*/

#define SO_NODE_SOURCE(classname)
/*!
  \def SO_NODE_SOURCE(classname)

  This macro sets up the impementation of the declarations in \ref
  SO_NODE_HEADER.  It chould be placed in the implementation file for
  extension nodes.

  \sa SO_NODE_HEADER
  \ingroup nodes
*/

#define SO_NODE_ABSTRACT_SOURCE(classname)
/*!
  \def SO_NODE_ABSTRACT_SOURCE(classname)

  This macro sets up the impementation of the declarations in \ref
  SO_NODE_ABSTRACT_HEADER.  It chould be placed in the implementation
  file for abstract extension nodes.

  \sa SO_NODE_ABSTRACT_HEADER
  \ingroup nodes
*/

#define SO_NODE_CONSTRUCTOR(classname)
/*!
  \def SO_NODE_CONSTRUCTOR(classname)

  Place this in the node constructor.  It sets up the fielddata object
  for the node class.

  \ingroup nodes
*/

#define SO_NODE_IS_FIRST_INSTANCE()
/*!
  \def SO_NODE_IS_FIRST_INSTANCE()

  This macro can be used as a predicate to test if the constructed
  node is the first constructed instance of a node class, in case some
  extra initialization needs to be done that can't be done in the
  initClass() function.

  \ingroup nodes
*/

#define SO_NODE_ADD_FIELD(field, defaultvalue)
/*!
  \def SO_NODE_ADD_FIELD(field, (defaultvalue))

  This registers a field for a node, and sets its value to the default
  value.  For use in the constructor, below the \ref
  SO_NODE_CONSTRUCTOR macro.

  \ingroup nodes
*/

#define SO_NODE_DEFINE_ENUM_VALUE(enumname, enumvalue)
/*!
  \def SO_NODE_DEFINE_ENUM_VALUE(enumname, enumvalue)

  This macro associates enum names with values, used for file
  input/output.

  \ingroup nodes
*/

