/**************************************************************
 *
 * 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.
 *
 *************************************************************/



#if ! defined INCLUDED_XMLSCRIPT_MISC_HXX
#define INCLUDED_XMLSCRIPT_MISC_HXX

#include "com/sun/star/uno/Any.hxx"

#define OUSTR(x) ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(x) )


namespace xmlscript
{

//==============================================================================
template< typename T >
inline void extract_throw( T * p, ::com::sun::star::uno::Any const & a )
{
    if (! (a >>= *p))
    {
        throw ::com::sun::star::uno::RuntimeException(
            OUSTR("expected ") + ::getCppuType( p ).getTypeName(),
            ::com::sun::star::uno::Reference<
            ::com::sun::star::uno::XInterface>() );
    }
}

//==============================================================================
template< typename T >
inline T extract_throw( ::com::sun::star::uno::Any const & a )
{
    T v = T();
    extract_throw<T>( &v, a );
    return v;
}

}

#endif
