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



// Base header file.  Must be first.
#include <xalanc/XalanExtensions/XalanExtensionsDefinitions.hpp>



// Base class header file...
#include <xalanc/XPath/Function.hpp>



#include <xalanc/XSLT/XResultTreeFrag.hpp>



namespace XALAN_CPP_NAMESPACE {



/**
 * XPath implementation of "node-set" function.
 */
class XALAN_XALANEXTENSIONS_EXPORT FunctionNodeSet : public Function
{
public:

    typedef Function    ParentType;

    /**
     * Constructor.
     * 
     * @param convertString If true, strings as well as result tree fragments will be converted to nodesets.
     */
    FunctionNodeSet(bool    convertString = true);

    virtual
    ~FunctionNodeSet();

    // These methods are inherited from Function ...

    virtual XObjectPtr
    execute(
            XPathExecutionContext&          executionContext,
            XalanNode*                      context,
            const XObjectArgVectorType&     args,
            const Locator*                  locator) const;

    using ParentType::execute;

    virtual FunctionNodeSet*
    clone(MemoryManager& theManager) const;

protected:

    virtual const XalanDOMString&
    getError(XalanDOMString& theResult) const;

    virtual const XalanDOMString&
    getInvalidArgumentTypeError(XalanDOMString& theResult) const;

private:

    // Not implemented...
    FunctionNodeSet&
    operator=(const FunctionNodeSet&);

    bool
    operator==(const FunctionNodeSet&) const;


    // Data members...
    const bool  m_convertString;
};



}



#endif  // FUNCTIONNODESET_HEADER_GUARD_1357924680
