/*
 * Copyright 2004,2005 The Apache Software Foundation.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
 
 #ifndef AXIS2_OM_CHILDREN_QNAME_ITERATOR_H
 #define AXIS2_OM_CHILDREN_QNAME_ITERATOR_H
 
/**
 *@file axis2_om_children_qname_iterator.h	
 *@brief this is the iterator for om nodes using qname
 */
 
 #include <axis2_om_node.h>
 #include <axis2_om_namespace.h>
 #include <axis2_qname.h>
 
 
 #ifdef __cplusplus
extern "C"
{
#endif

typedef struct axis2_om_children_qname_iterator_ops axis2_om_children_qname_iterator_ops_t;
typedef struct axis2_om_children_qname_iterator axis2_om_children_qname_iterator_t;

/**
 * @defgroup axis2_xml_writer 
 * @ingroup axis2_om_parser
 * @{
 */

   /**
    * \brief axis2_om_children_iterator operations
    * Encapsulator struct for operations of axis2_om_iterator
    */

    AXIS2_DECLARE_DATA struct axis2_om_children_qname_iterator_ops
    {
        axis2_status_t (AXIS2_CALL *free_fn)
                            (axis2_om_children_qname_iterator_t *iterator,
                             axis2_env_t **env);
                             
        /**
        * Removes from the underlying collection the last element returned by the
        * iterator (optional operation).  This method can be called only once per
        * call to <tt>next</tt>.  The behavior of an iterator is unspecified if
        * the underlying collection is modified while the iteration is in
        * progress in any way other than by calling this method.
        */                                              
        axis2_status_t (AXIS2_CALL *remove)
                            (axis2_om_children_qname_iterator_t *iterator,
                             axis2_env_t **env);
                             
       /**
        * Returns <tt>true</tt> if the iteration has more elements. (In other
        * words, returns <tt>true</tt> if <tt>next</tt> would return an element
        * rather than throwing an exception.)
        */                             
        
        axis2_bool_t (AXIS2_CALL *has_next)
                            (axis2_om_children_qname_iterator_t *iterator,
                             axis2_env_t **env);
    
       /**
        * Returns the next element in the iteration.
        */
        axis2_om_node_t* (AXIS2_CALL *next)
                            (axis2_om_children_qname_iterator_t *iterator,
                             axis2_env_t **env);
                             
                        
        
    };

struct axis2_om_children_qname_iterator
{
    axis2_om_children_qname_iterator_ops_t *ops;
};

AXIS2_DECLARE(axis2_om_children_qname_iterator_t *)
axis2_om_children_qname_iterator_create(axis2_env_t **env,
                                        axis2_om_node_t *current_child,
                                        axis2_qname_t *given_qname);
 

#define AXIS2_OM_CHILDREN_QNAME_ITERATOR_FREE(iterator, env) \
        ((iterator)->ops->free_fn(iterator, env))

#define AXIS2_OM_CHILDREN_QNAME_ITERATOR_REMOVE(iterator, env) \
        ((iterator)->ops->remove(iterator, env))

#define AXIS2_OM_CHILDREN_QNAME_ITERATOR_HAS_NEXT(iterator, env) \
        ((iterator)->ops->has_next(iterator, env))

#define AXIS2_OM_CHILDREN_QNAME_ITERATOR_NEXT(iterator, env) \
        ((iterator)->ops->next(iterator, env))

 
/** @} */

#ifdef __cplusplus
}
#endif
 
#endif /* AXIS2_OM_CHILDREN_QNAME_ITERATOR_H */
