/**************************************************************
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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 __com_sun_star_container_XEnumerableMap_idl__
#define __com_sun_star_container_XEnumerableMap_idl__

#include <com/sun/star/container/XMap.idl>
#include <com/sun/star/container/XEnumeration.idl>
#include <com/sun/star/lang/NoSupportException.idl>

//=============================================================================

module com { module sun { module star { module container {

//=============================================================================

/** extends <type>XMap</type> with enumeration capabilities.

    <p>No assumption should be made about the ordering of the elements returned by the various enumerators.
    In particular, you cannot assume the elements are returned in the same order as they were inserted. Also,
    you should not expect the <code>XMap</code> implementation to make use of a possibly existing strict ordering
    defined on the domain of all possible key values.</p>

    <p>You can create enumerators for the keys of the map, its values, and its key-value pairs.</p>

    <p>In all cases, you can create an <em>isolated</em> enumerator, which works on a copy of the
    map's content. Such an iterator is not affected by changes done to the map after creation of
    the enumerator.</p>

    <p>On the contrary, an enumerator which is <em>non-isolated</em> works directly on the map data.
    This is less expensive than an <em>isolated</em> enumerator, but means that changes to the map while
    an enumeration is running potentially invalidate your enumerator. The concrete behavior in this
    case is undefined, it's up to the service implementing the <code>XEnumerableMap</code> interface
    to specify it in more detail.</p>

    <p>Implementations of this interface might decide to support only <em>isolated</em> enumerators, or
    only <em>non-isolated</em> enumerators. Again, it's up to the service to specify this. Requesting an
    enumerator type which is not supported will generally result in an <type scope="com::sun::star::lang">NoSupportException</type>
    being thrown.</p>
 */
interface XEnumerableMap : XMap
{
    /** creates a enumerator for the keys of the map

        @param Isolated
            controls whether the newly create enumerator should be isolated from the map.

        @throws ::com::sun::star::lang::NoSupportException
            if the specified enumerator method is not supported by the implementation.
    */
    XEnumeration createKeyEnumeration( [in] boolean Isolated )
        raises ( ::com::sun::star::lang::NoSupportException );

    /** creates a enumerator for the values of the map

        @param Isolated
            controls whether the newly create enumerator should be isolated from the map.

        @throws ::com::sun::star::lang::NoSupportException
            if the specified enumerator method is not supported by the implementation.
    */
    XEnumeration createValueEnumeration( [in] boolean Isolated )
        raises ( ::com::sun::star::lang::NoSupportException );

    /** creates a enumerator for the key-value pairs of the map

        <p>The elements returned by the enumerator are instances of <type scope="com::sun::star::beans">Pair</type>,
        holding the key-value-pairs which are part of the map.</p>

        @param Isolated
            controls whether the newly create enumerator should be isolated from the map.

        @throws ::com::sun::star::lang::NoSupportException
            if the specified enumerator method is not supported by the implementation.
    */
    XEnumeration createElementEnumeration( [in] boolean Isolated )
        raises ( ::com::sun::star::lang::NoSupportException );
};

//=============================================================================

}; }; }; };

//=============================================================================

#endif
