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



// Base header file.  Must be first.
#include <xalanc/XPath/XPathDefinitions.hpp>



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



namespace XALAN_CPP_NAMESPACE {



class XALAN_XPATH_EXPORT XalanQNameByReference : public XalanQName
{
public:

    /**
     * Construct an empty XalanQNameByReference.
     */
    explicit
    XalanQNameByReference();

    /**
     * Construct a XalanQNameByReference, with the supplied namespace and local part.
     * The instance keeps only a _reference_ to the string, to avoid making a
     * copy.
     *
     * @param theNamespace namespace string
     * @param theLocalPart local part string
     */
    XalanQNameByReference(
            const XalanDOMString&   theNamespace,
            const XalanDOMString&   theLocalPart);

    /**
     * Construct a XalanQNameByReference, with the supplied local part.
     * The instance keeps only a _reference_ to the string, to avoid making a
     * copy.
     *
     * @param theLocalPart local part string
     */
    XalanQNameByReference(const XalanDOMString&     theLocalPart);

    /**
     * Construct a XalanQNameByReference, from the supplied XalanQName.  The instance
     * keeps only a _reference_ to the string, to avoid making a copy.
     *
     * @param theQName The source QName
     */
    XalanQNameByReference(const XalanQName&     theQName);

    virtual
    ~XalanQNameByReference();

    /**
     * Retrieve the local part of qualified name.
     * 
     * @return local part string
     */
    virtual const XalanDOMString&
    getLocalPart() const;

    /**
     * Set the local part of qualified name.
     * 
     * @param theLocalPart local part string
     */
    void
    setLocalPart(const XalanDOMString&  theLocalPart)
    {
        m_localpart = &theLocalPart;
    }

    /**
     * Retrieve the namespace of qualified name.
     * 
     * @return namespace string
     */
    virtual const XalanDOMString&
    getNamespace() const;

    /**
     * Set the Namespace URI of qualified name.
     * 
     * @param theLocalPart local part string
     */
    void
    setNamespace(const XalanDOMString&  theNamespace)
    {
        m_namespace = &theNamespace;
    }

    /**
     * Clear the instance.
     */
    void
    clear()
    {
        m_namespace = &s_emptyString;
        m_localpart = &s_emptyString;
    }

private:

    // OK, we said reference, but using pointers
    // allows for copy and assignment semantics.
    const XalanDOMString*   m_namespace;

    const XalanDOMString*   m_localpart;
};



template<>
struct XalanMapKeyTraits<XalanQNameByReference> : public XalanMapKeyTraits<XalanQName>
{
};



}



#endif  // XALANQNAMEBYREFERENCE_HEADER_GUARD_1357924680
