/*
 * 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(XALANSOURCETREEINIT_INCLUDE_GUARD_1357924680)
#define XALANSOURCETREEINIT_INCLUDE_GUARD_1357924680



// Base include file.  Must be first.
#include <xalanc/XalanSourceTree/XalanSourceTreeDefinitions.hpp>


#include <xalanc/Include/XalanMemoryManagement.hpp>


#include <xalanc/PlatformSupport/PlatformSupportInit.hpp>



#include <xalanc/DOMSupport/DOMSupportInit.hpp>



#include <xalanc/XMLSupport/XMLSupportInit.hpp>



#include <xalanc/XPath/XPathInit.hpp>



namespace XALAN_CPP_NAMESPACE {



class XALAN_XALANSOURCETREE_EXPORT XalanSourceTreeInit
{
public:

    explicit
    XalanSourceTreeInit(MemoryManager& theManager XALAN_DEFAULT_MEMMGR);

    ~XalanSourceTreeInit();

private:

    // Not implemented...
    XalanSourceTreeInit(const XalanSourceTreeInit&);

    XalanSourceTreeInit&
    operator=(const XalanSourceTreeInit&);

    
    static void
    initialize(MemoryManager& theManager);

    static void
    terminate();

    const PlatformSupportInit   m_platformSupportInit;

    const DOMSupportInit        m_domSupportInit;

    const XMLSupportInit        m_xmlSupportInit;

    static unsigned long    s_initCounter;
};



}



#endif  // !defined(XALANSOURCETREEINIT_INCLUDE_GUARD_1357924680)
