/*
 * Copyright 2003-2004 The Apache Software Foundation.

 *
 * Licensed 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.
 *
 * This file was auto-generated by the Axis C++ Web Service Generator (WSDL2Ws)
 * This file contains definitions of the web service
 */

#include "XSD_token.hpp"


XSD_token::XSD_token()
{
}

XSD_token::~XSD_token()
{
}

/* This function is called by the AxisEngine when something went wrong
 with the current web service request processing. Appropriate actions should
 be taken here.*/
void XSD_token::onFault()
{
}

xsd__token XSD_token::asNonNillableElement(xsd__token Value0)  
{
	return Value0;
}
xsd__token XSD_token::asNillableElement(xsd__token Value0)  
{
	return Value0;
}
RequiredAttributeElement* XSD_token::asRequiredAttribute(RequiredAttributeElement* Value0)  
{
	return Value0;
}
OptionalAttributeElement* XSD_token::asOptionalAttribute(OptionalAttributeElement* Value0)  
{
	return Value0;
}
xsd__token_Array * XSD_token::asArray(xsd__token_Array * Value0)  
{
	return Value0;
}
SimpleComplexType* XSD_token::asComplexType(SimpleComplexType* Value0)  
{
	return Value0;
}
