1d291ea28SAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3d291ea28SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4d291ea28SAndrew Rist * or more contributor license agreements. See the NOTICE file 5d291ea28SAndrew Rist * distributed with this work for additional information 6d291ea28SAndrew Rist * regarding copyright ownership. The ASF licenses this file 7d291ea28SAndrew Rist * to you under the Apache License, Version 2.0 (the 8d291ea28SAndrew Rist * "License"); you may not use this file except in compliance 9d291ea28SAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 11d291ea28SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 13d291ea28SAndrew Rist * Unless required by applicable law or agreed to in writing, 14d291ea28SAndrew Rist * software distributed under the License is distributed on an 15d291ea28SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16d291ea28SAndrew Rist * KIND, either express or implied. See the License for the 17d291ea28SAndrew Rist * specific language governing permissions and limitations 18d291ea28SAndrew Rist * under the License. 19cdf0e10cSrcweir * 20d291ea28SAndrew Rist *************************************************************/ 21cdf0e10cSrcweir 22cdf0e10cSrcweir #include <precomp.h> 23cdf0e10cSrcweir #include <ary/cpp/c_funct.hxx> 24cdf0e10cSrcweir 25cdf0e10cSrcweir 26cdf0e10cSrcweir 27cdf0e10cSrcweir // NOT FULLY DECLARED SERVICES 28cdf0e10cSrcweir #include <algorithm> 29cdf0e10cSrcweir #include <ary/cpp/c_funct.hxx> 30cdf0e10cSrcweir 31cdf0e10cSrcweir 32cdf0e10cSrcweir 33cdf0e10cSrcweir 34cdf0e10cSrcweir 35cdf0e10cSrcweir namespace 36cdf0e10cSrcweir { 37cdf0e10cSrcweir using namespace ::ary::cpp; 38cdf0e10cSrcweir 39cdf0e10cSrcweir 40cdf0e10cSrcweir class Parameter_2_NonTypeParamInfo 41cdf0e10cSrcweir { 42cdf0e10cSrcweir public: 43cdf0e10cSrcweir String operator()( 44cdf0e10cSrcweir const S_Parameter & i_rParam ) const; 45cdf0e10cSrcweir }; 46cdf0e10cSrcweir 47cdf0e10cSrcweir class Parameter_2_Type 48cdf0e10cSrcweir { 49cdf0e10cSrcweir public: 50cdf0e10cSrcweir Type_id operator()( 51cdf0e10cSrcweir const S_Parameter & i_rParam ) const 52cdf0e10cSrcweir { return i_rParam.nType; } 53cdf0e10cSrcweir }; 54cdf0e10cSrcweir 55cdf0e10cSrcweir /** @return 56cdf0e10cSrcweir A vector with Strings like this: 57cdf0e10cSrcweir "ParamName" or "ParamName[ArraySize]" or "ParamName = InitValue". 58cdf0e10cSrcweir */ 59cdf0e10cSrcweir StringVector Create_NonTypeParameterInfos( 60cdf0e10cSrcweir const std::vector<S_Parameter> & 61cdf0e10cSrcweir i_rParameters ); 62cdf0e10cSrcweir /** @return 63cdf0e10cSrcweir A vector of the parameters' type ids. 64cdf0e10cSrcweir */ 65cdf0e10cSrcweir std::vector<Type_id> 66cdf0e10cSrcweir Create_ParameterTypeList( 67cdf0e10cSrcweir const std::vector<S_Parameter> & 68cdf0e10cSrcweir i_rParameters ); 69cdf0e10cSrcweir 70*e4384c19SJohn Bampton } // namespace anonymous 71cdf0e10cSrcweir 72cdf0e10cSrcweir 73cdf0e10cSrcweir namespace ary 74cdf0e10cSrcweir { 75cdf0e10cSrcweir namespace cpp 76cdf0e10cSrcweir { 77cdf0e10cSrcweir 78cdf0e10cSrcweir Function::Function( const String & i_sLocalName, 79cdf0e10cSrcweir Ce_id i_nOwner, 80cdf0e10cSrcweir E_Protection i_eProtection, 81cdf0e10cSrcweir Lid i_nFile, 82cdf0e10cSrcweir Type_id i_nReturnType, 83cdf0e10cSrcweir const std::vector<S_Parameter> & 84cdf0e10cSrcweir i_parameters, 85cdf0e10cSrcweir E_ConVol i_conVol, 86cdf0e10cSrcweir E_Virtuality i_eVirtuality, 87cdf0e10cSrcweir FunctionFlags i_aFlags, 88cdf0e10cSrcweir bool i_bThrowExists, 89cdf0e10cSrcweir const std::vector<Type_id> & 90cdf0e10cSrcweir i_rExceptions ) 91cdf0e10cSrcweir : aEssentials( i_sLocalName, 92cdf0e10cSrcweir i_nOwner, 93cdf0e10cSrcweir i_nFile ), 94cdf0e10cSrcweir aTemplateParameterTypes(), 95cdf0e10cSrcweir aSignature( Create_ParameterTypeList(i_parameters), 96cdf0e10cSrcweir i_conVol ), 97cdf0e10cSrcweir nReturnType(i_nReturnType), 98cdf0e10cSrcweir eProtection(i_eProtection), 99cdf0e10cSrcweir eVirtuality(i_eVirtuality), 100cdf0e10cSrcweir aFlags(i_aFlags), 101cdf0e10cSrcweir aParameterInfos( Create_NonTypeParameterInfos(i_parameters) ), 102cdf0e10cSrcweir pExceptions( i_bThrowExists ? new ExceptionTypeList(i_rExceptions) : 0 ) 103cdf0e10cSrcweir { 104cdf0e10cSrcweir } 105cdf0e10cSrcweir 106cdf0e10cSrcweir Function::~Function() 107cdf0e10cSrcweir { 108cdf0e10cSrcweir } 109cdf0e10cSrcweir 110cdf0e10cSrcweir bool 111cdf0e10cSrcweir Function::IsIdentical( const Function & i_f ) const 112cdf0e10cSrcweir { 113cdf0e10cSrcweir return 114cdf0e10cSrcweir LocalName() == i_f.LocalName() 115cdf0e10cSrcweir AND 116cdf0e10cSrcweir Owner() == i_f.Owner() 117cdf0e10cSrcweir AND 118cdf0e10cSrcweir aSignature == i_f.aSignature 119cdf0e10cSrcweir AND 120cdf0e10cSrcweir nReturnType == i_f.nReturnType 121cdf0e10cSrcweir AND 122cdf0e10cSrcweir eProtection == i_f.eProtection 123cdf0e10cSrcweir AND 124cdf0e10cSrcweir eVirtuality == i_f.eVirtuality 125cdf0e10cSrcweir AND 126cdf0e10cSrcweir aFlags == i_f.aFlags 127cdf0e10cSrcweir AND 128cdf0e10cSrcweir ( ( NOT pExceptions AND NOT i_f.pExceptions ) 129cdf0e10cSrcweir OR 130cdf0e10cSrcweir ( pExceptions AND i_f.pExceptions 131cdf0e10cSrcweir ? *pExceptions == *i_f.pExceptions 132cdf0e10cSrcweir : false ) 133cdf0e10cSrcweir ) 134cdf0e10cSrcweir AND 135cdf0e10cSrcweir aTemplateParameterTypes.size() == i_f.aTemplateParameterTypes.size(); 136cdf0e10cSrcweir } 137cdf0e10cSrcweir 138cdf0e10cSrcweir void 139cdf0e10cSrcweir Function::Add_TemplateParameterType( const String & i_sLocalName, 140cdf0e10cSrcweir Type_id i_nIdAsType ) 141cdf0e10cSrcweir { 142cdf0e10cSrcweir aTemplateParameterTypes.push_back( 143cdf0e10cSrcweir List_TplParam::value_type(i_sLocalName, i_nIdAsType) ); 144cdf0e10cSrcweir } 145cdf0e10cSrcweir 146cdf0e10cSrcweir 147cdf0e10cSrcweir const String & 148cdf0e10cSrcweir Function::inq_LocalName() const 149cdf0e10cSrcweir { 150cdf0e10cSrcweir return aEssentials.LocalName(); 151cdf0e10cSrcweir } 152cdf0e10cSrcweir 153cdf0e10cSrcweir Cid 154cdf0e10cSrcweir Function::inq_Owner() const 155cdf0e10cSrcweir { 156cdf0e10cSrcweir return aEssentials.Owner(); 157cdf0e10cSrcweir } 158cdf0e10cSrcweir 159cdf0e10cSrcweir Lid 160cdf0e10cSrcweir Function::inq_Location() const 161cdf0e10cSrcweir { 162cdf0e10cSrcweir return aEssentials.Location(); 163cdf0e10cSrcweir } 164cdf0e10cSrcweir 165cdf0e10cSrcweir void 166cdf0e10cSrcweir Function::do_Accept(csv::ProcessorIfc & io_processor) const 167cdf0e10cSrcweir { 168cdf0e10cSrcweir csv::CheckedCall(io_processor,*this); 169cdf0e10cSrcweir } 170cdf0e10cSrcweir 171cdf0e10cSrcweir ClassId 172cdf0e10cSrcweir Function::get_AryClass() const 173cdf0e10cSrcweir { 174cdf0e10cSrcweir return class_id; 175cdf0e10cSrcweir } 176cdf0e10cSrcweir 177cdf0e10cSrcweir 178cdf0e10cSrcweir 179cdf0e10cSrcweir } // namespace cpp 180cdf0e10cSrcweir } // namespace ary 181cdf0e10cSrcweir 182cdf0e10cSrcweir 183cdf0e10cSrcweir 184cdf0e10cSrcweir namespace 185cdf0e10cSrcweir { 186cdf0e10cSrcweir 187cdf0e10cSrcweir String 188cdf0e10cSrcweir Parameter_2_NonTypeParamInfo::operator()( const ary::cpp::S_Parameter & i_rParam ) const 189cdf0e10cSrcweir { 190cdf0e10cSrcweir static StreamStr aParamName_(1020); 191cdf0e10cSrcweir aParamName_.seekp(0); 192cdf0e10cSrcweir 193cdf0e10cSrcweir aParamName_ << i_rParam.sName; 194cdf0e10cSrcweir if ( i_rParam.sSizeExpression.length() > 0 ) 195cdf0e10cSrcweir { 196cdf0e10cSrcweir aParamName_ << '[' 197cdf0e10cSrcweir << i_rParam.sSizeExpression 198cdf0e10cSrcweir << ']'; 199cdf0e10cSrcweir } 200cdf0e10cSrcweir if ( i_rParam.sInitExpression.length() > 0 ) 201cdf0e10cSrcweir { 202cdf0e10cSrcweir aParamName_ << " = " 203cdf0e10cSrcweir << i_rParam.sInitExpression; 204cdf0e10cSrcweir } 205cdf0e10cSrcweir 206cdf0e10cSrcweir return aParamName_.c_str(); 207cdf0e10cSrcweir } 208cdf0e10cSrcweir 209cdf0e10cSrcweir 210cdf0e10cSrcweir StringVector 211cdf0e10cSrcweir Create_NonTypeParameterInfos( const std::vector<S_Parameter> & i_rParameters ) 212cdf0e10cSrcweir { 213cdf0e10cSrcweir static Parameter_2_NonTypeParamInfo 214cdf0e10cSrcweir aTransformFunction_; 215cdf0e10cSrcweir 216cdf0e10cSrcweir StringVector 217cdf0e10cSrcweir ret(i_rParameters.size(), String::Null_()); 218cdf0e10cSrcweir std::transform( i_rParameters.begin(), i_rParameters.end(), 219cdf0e10cSrcweir ret.begin(), 220cdf0e10cSrcweir aTransformFunction_ ); 221cdf0e10cSrcweir return ret; 222cdf0e10cSrcweir } 223cdf0e10cSrcweir 224cdf0e10cSrcweir std::vector<Type_id> 225cdf0e10cSrcweir Create_ParameterTypeList( const std::vector<S_Parameter> & i_rParameters ) 226cdf0e10cSrcweir { 227cdf0e10cSrcweir static Parameter_2_Type 228cdf0e10cSrcweir aTransformFunction_; 229cdf0e10cSrcweir 230cdf0e10cSrcweir std::vector<Type_id> 231cdf0e10cSrcweir ret(i_rParameters.size(), Type_id(0)); 232cdf0e10cSrcweir std::transform( i_rParameters.begin(), i_rParameters.end(), 233cdf0e10cSrcweir ret.begin(), 234cdf0e10cSrcweir aTransformFunction_ ); 235cdf0e10cSrcweir return ret; 236cdf0e10cSrcweir } 237cdf0e10cSrcweir 238cdf0e10cSrcweir 239cdf0e10cSrcweir 240cdf0e10cSrcweir 241cdf0e10cSrcweir } // namespace anonymous 242