apicompatanamdw/compatanalysercmd/libraryanalyser/src/la_functionanalysis.cpp
author shrivatsa
Mon, 27 Sep 2010 14:51:17 +0530
changeset 12 a0eee409ff14
parent 0 638b9c697799
permissions -rw-r--r--
Updates to CompatibilityAnalyser - The Tool should now work with Symbian^4 - Some minor bug fixes related to Qt headers in the Symbian Platform
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
     1
/*
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
     2
* Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). 
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
     3
* All rights reserved.
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
     4
* This component and the accompanying materials are made available
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
     6
* which accompanies this distribution, and is available
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
     8
*
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
     9
* Initial Contributors:
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    11
*
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    12
* Contributors:
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    13
*
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    14
* Description:  Functionality of function analysis 
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    15
*
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    16
*/
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    17
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    18
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    19
#include "la.hpp"
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    20
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    21
// ----------------------------------------------------------------------------------------------------------
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    22
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    23
/**
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    24
 * This flags affects to the function comparison policy.
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    25
 */
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    26
// Default policy (=exact match):
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    27
#define COMPARE_FLAG_NONE                       0x00000000
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    28
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    29
// This flag means that adding a 'const' qualifier to a function
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    30
// parameter does not generate BBC break issue:
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    31
#define COMPARE_FLAG_ALLOW_CONST_ADDITION       0x00000001
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    32
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    33
// ----------------------------------------------------------------------------------------------------------
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    34
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    35
// Forward declaration
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    36
class ParameterList;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    37
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    38
// ParameterElement class represents a parameter element, which has an actual
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    39
// value and optional sub-parameters.
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    40
class ParameterElement
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    41
{
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    42
public:
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    43
    // Default constructor and destructor
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    44
    ParameterElement();
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    45
    virtual ~ParameterElement();
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    46
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    47
    // Copy constructor
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    48
    ParameterElement(const ParameterElement& rhs);
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    49
    // Assignment operator
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    50
    const ParameterElement& operator= (const ParameterElement& rhs);
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    51
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    52
    // Methods for getting the element value.
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    53
    string& Value() { return val; };
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    54
    const string& Value() const { return val; };
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    55
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    56
    // Methods for getting the sub-parameters.
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    57
    ParameterList* SubParameters() { return subPars; };
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    58
    const ParameterList* SubParameters() const { return subPars; };
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    59
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    60
    // Sets the sub-parameters. Takes the ownership to the given 
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    61
    // sub-parameter list pointer.
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    62
    void SetSubParameters( ParameterList* pPars );
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    63
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    64
    // Clears the value and sub-parameters.
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    65
    void Clear();
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    66
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    67
private:
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    68
    string val;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    69
    ParameterList* subPars;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    70
};
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    71
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    72
// ----------------------------------------------------------------------------------------------------------
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    73
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    74
typedef vector<ParameterElement> FunctionParameter;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    75
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    76
class ParameterList : public vector<FunctionParameter>
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    77
{};
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    78
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    79
ParameterElement::ParameterElement() 
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    80
{
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    81
    subPars = new ParameterList(); 
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    82
}
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    83
ParameterElement::~ParameterElement()
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    84
{
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    85
    delete subPars;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    86
}
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    87
ParameterElement::ParameterElement(const ParameterElement& rhs)
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    88
{
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    89
    val = rhs.val;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    90
    if( rhs.subPars )
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    91
        subPars = new ParameterList(*(rhs.subPars));
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    92
    else
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    93
        subPars = 0;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    94
}
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    95
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    96
void ParameterElement::Clear() 
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    97
{
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    98
    val.clear();
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    99
    if( subPars )
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   100
        subPars->clear();
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   101
}
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   102
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   103
const ParameterElement& ParameterElement::operator= (const ParameterElement& rhs)
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   104
    {
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   105
        if( this != &rhs )
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   106
        {
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   107
            val = rhs.val;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   108
            delete subPars;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   109
            if( rhs.subPars )
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   110
                subPars = new ParameterList(*(rhs.subPars));
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   111
            else
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   112
                subPars = 0;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   113
        }
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   114
        return *this;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   115
    }
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   116
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   117
void ParameterElement::SetSubParameters( ParameterList* pPars )
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   118
{
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   119
    delete subPars;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   120
    subPars = pPars;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   121
}
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   122
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   123
// ----------------------------------------------------------------------------------------------------------
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   124
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   125
/**
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   126
 * This structure represents the C++ cv-qualifier.
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   127
 */
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   128
struct CVQualifier
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   129
{
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   130
    static const string constQualifier;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   131
    static const string volatileQualifier;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   132
    static const string constVolatileQualifier;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   133
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   134
    CVQualifier() { isConst = false; isVolatile = false; };
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   135
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   136
    /**
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   137
     * Set function gets <code>std::string</code> as an input and sets const 
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   138
     * and/or volatile flags according to the input.
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   139
     * @param cvStr String representing the const and / or volatile qualifier
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   140
     * i.e "const", "volatile" or "const volatile".
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   141
     */
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   142
    void Set(string const& cvStr)
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   143
    {
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   144
        if( cvStr == constQualifier )
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   145
        {
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   146
            isConst = true;         
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   147
            isVolatile = false;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   148
        }
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   149
        else if( cvStr == volatileQualifier )
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   150
        {
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   151
            isConst = false;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   152
            isVolatile = true;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   153
        }
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   154
        else if( cvStr == constVolatileQualifier )
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   155
        {
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   156
            isConst = true;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   157
            isVolatile = true;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   158
        }        
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   159
        else
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   160
        {
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   161
            isConst = false;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   162
            isVolatile = false;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   163
        }
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   164
    };
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   165
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   166
    /**
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   167
     * Sets const and/or volatile flags
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   168
     * @param c 'const' qualifier. If TRUE, isConst flag is set to TRUE
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   169
     * @param v 'volatile' qualifier. If TRUE, isVolatile flag is set to TRUE
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   170
     */
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   171
    void Set( bool c, bool v )
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   172
    {
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   173
        isConst = c;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   174
        isVolatile = v;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   175
    };
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   176
    bool isConst;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   177
    bool isVolatile;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   178
};
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   179
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   180
// ----------------------------------------------------------------------------------------------------------
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   181
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   182
const string CVQualifier::constQualifier = string("const");
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   183
const string CVQualifier::volatileQualifier = string("volatile");
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   184
const string CVQualifier::constVolatileQualifier = string("const volatile");
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   185
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   186
// ----------------------------------------------------------------------------------------------------------
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   187
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   188
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   189
// This represents the function signature
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   190
struct FuncSignature
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   191
{    
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   192
    string nestedName; // name part
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   193
    ParameterList parameters; // parameters
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   194
    CVQualifier cvQualifier; // cv-qualifier of function
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   195
};
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   196
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   197
// ----------------------------------------------------------------------------------------------------------
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   198
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   199
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   200
bool AreParametersCompatible(const FunctionParameter& basePar, const FunctionParameter& currPar, unsigned int CompareFlags = COMPARE_FLAG_NONE);
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   201
string::const_iterator RemoveSpaces(string::const_iterator start, string::const_iterator end, string::const_iterator& result);
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   202
string::size_type ReadCharsInTag(const string& sig, string& argElem, string::size_type startPos, pair<char, char> const& tag);
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   203
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   204
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   205
// ----------------------------------------------------------------------------------------------------------
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   206
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   207
/**
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   208
 * Reads characters inside the given tag. Starts looking for the
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   209
 * starting tag at startPos. 
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   210
 * @param sig Reference to the string representing the function signature. 
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   211
 * @param argElem Reference to the string in which the parameter list is read.
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   212
 * @param startPos Tag starting point (e.g. '<' or '(') is startet to be searched
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   213
 *        after this location.
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   214
 * @param tag This object defines the starting and ending characters of the tag (e.g. '<' and '>').
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   215
 * @return Size of the string between the start and end characters of the tag.
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   216
 */
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   217
string::size_type ReadCharsInTag(const string& sig, string& argElem, string::size_type startPos, pair<char, char> const& tag)
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   218
{
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   219
    string::size_type sigLen = sig.size();
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   220
    if( sigLen == 0 )
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   221
    {
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   222
        return 0;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   223
    }
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   224
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   225
    if( sig.at(startPos) != tag.first )
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   226
    {
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   227
        startPos = sig.find(tag.first, startPos);
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   228
    }
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   229
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   230
    string::size_type currPos = startPos;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   231
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   232
    int tagCnt = 0; // This counter will be increased by 1 when tag starts and
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   233
                    // decreased by 1 when the tag ends. When it reaches zero,
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   234
                    // the tag has been completely read.
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   235
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   236
    do
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   237
    {            
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   238
        const char current = sig.at(currPos); // throws, if out of bounds
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   239
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   240
        if( current == tag.first )
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   241
            ++tagCnt; // tag starts
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   242
        else if( current == tag.second )
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   243
            --tagCnt; // tag ends
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   244
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   245
        ++currPos;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   246
    }
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   247
    while( tagCnt > 0 );
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   248
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   249
    string::size_type len = currPos - startPos;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   250
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   251
    if( len > 0 )
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   252
    {
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   253
        argElem.append(sig.begin() + startPos, sig.begin() + currPos);
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   254
    }
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   255
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   256
    return len;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   257
}
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   258
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   259
// ----------------------------------------------------------------------------------------------------------
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   260
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   261
/**
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   262
 * ParseParameterList. Recursively parses the given sub-string into
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   263
 * parameter list object.
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   264
 * @param funcSignature Reference to the string representing the function 
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   265
 *        signature.
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   266
 * @param parBegin Location where the parameter list starts.
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   267
 * @param parEnd Location where the parameter list ends.
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   268
 * @param parameters Parameter list of the function is returned here.
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   269
 */
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   270
void ParseParameterList(const string& funcSignature, 
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   271
                        string::size_type parBegin, 
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   272
                        string::size_type parEnd, 
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   273
                        ParameterList& parameters)
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   274
{    
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   275
    FunctionParameter par; // Object holding the current function parameter during parsing
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   276
    ParameterElement parElem; // Object holding the current parameter element during parsing
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   277
    
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   278
    while( parBegin <= parEnd )
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   279
    {
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   280
        char current = funcSignature.at(parBegin);
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   281
        switch( current )
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   282
        {
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   283
        case '(':
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   284
        case '<':
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   285
            {
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   286
                // Character '(' or '<' means that a new parameter list starts.
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   287
                // New parameter list is stored as a sub-parameter list of the current parameter.
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   288
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   289
                if( parElem.Value().size() > 0 )
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   290
                {
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   291
                    par.push_back(parElem); // Put the previous element in the list...
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   292
                    parElem.Clear(); // ...and clear the object for the next round.
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   293
                }
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   294
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   295
                string parListStr; // String representing the sub-parameterlist is stored here.
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   296
                int len = 0;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   297
                char tagEndMark = current == '(' ? ')' : '>';
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   298
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   299
                // Put the value "<>" or "()"
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   300
                parElem.Value().push_back(current);
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   301
                parElem.Value().push_back(tagEndMark);
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   302
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   303
                // Read sub-parameters...
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   304
                len += ReadCharsInTag( funcSignature, parListStr, parBegin, make_pair(current, tagEndMark) );
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   305
                // ...and parse them
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   306
                if( parElem.SubParameters() == 0 )
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   307
                {
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   308
                    parElem.SetSubParameters(new ParameterList());
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   309
                }
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   310
                ParseParameterList(parListStr, 1, len-1, *(parElem.SubParameters()) );
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   311
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   312
                par.push_back(parElem); // Put the current element in the list...
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   313
                parElem.Clear(); // ...and clear the object for the next round.
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   314
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   315
                parBegin += len;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   316
                break;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   317
            }        
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   318
        case ' ':        
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   319
            {
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   320
                // space means that we have a new parameter element
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   321
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   322
                if( parElem.Value().size() > 0 )
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   323
                {
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   324
                    par.push_back(parElem); // Put the previous element in the list...
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   325
                    parElem.Clear(); // ...and clear the object for the next round.
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   326
                }
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   327
                ++parBegin;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   328
                break;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   329
            }
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   330
        case ',':
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   331
        case ')':
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   332
        case '>':
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   333
            {
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   334
                // Parameter completed
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   335
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   336
                if( parElem.Value().size() > 0 )
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   337
                {
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   338
                    par.push_back(parElem); // Put the previous element in the list...
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   339
                    parElem.Clear(); //...and clear the object for the next round.
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   340
                }
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   341
                if( par.size() > 0 )
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   342
                {
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   343
                    // Put the parameter in the parameter list...
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   344
                    parameters.push_back(par);
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   345
                    par.clear(); //...and clear the object for the next round.
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   346
                }
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   347
                ++parBegin;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   348
                break;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   349
            }
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   350
        case '*':
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   351
        case '&':
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   352
            {
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   353
                // We have a pointer or reference
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   354
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   355
                if( parElem.Value().size() > 0 )
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   356
                {
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   357
                    par.push_back(parElem); // Put the previous element in the list...
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   358
                    parElem.Clear(); //...and clear the object for the next round.
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   359
                }
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   360
                // Put also the current element in the list (i.e. '*' or '&')
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   361
                parElem.Value().push_back(current);
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   362
                par.push_back(parElem);
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   363
                parElem.Clear(); // ...and clear the object for the next round.
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   364
                ++parBegin;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   365
                break;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   366
            }
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   367
        default:
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   368
            {
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   369
                parElem.Value().push_back(funcSignature.at(parBegin));
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   370
                ++parBegin;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   371
                break;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   372
            }
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   373
        }        
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   374
    }
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   375
}
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   376
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   377
// ----------------------------------------------------------------------------------------------------------
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   378
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   379
/**
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   380
 * ParseFunctionSignature
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   381
 * Parses function signature and returns following elements for the given 
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   382
 * function: 
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   383
 *  - name
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   384
 *  - parameters, which are splitted in elements and sub-parameters
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   385
 *  - cv-qualifier of the function
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   386
 *
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   387
 * Parameters are splitted in following elements: 
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   388
 *  - type (int, char, etc...)
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   389
 *  - cv-qualifier (const and/or volatile)
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   390
 *  - pointer symbol (*)
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   391
 *  - reference symbol (&)
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   392
 *  - parameter list "()" 
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   393
 *  - template parameter list "<>".
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   394
 *
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   395
 * Parameter lists are further splitted into sub-parameters, which also consists
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   396
 * of elements and sub-parameters.
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   397
 *
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   398
 * @param funcSignature Reference to the string representing the function signature
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   399
 * @param signature Parsed function signature is returned in this object.
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   400
 */
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   401
void ParseFunctionSignature( const string& funcSignature, FuncSignature& signature )
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   402
{    
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   403
    // Find the start and end positions of the "main" parameter list
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   404
    string::size_type openBracketIndex = funcSignature.find_first_of('(');
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   405
    string::size_type closeBracketIndex = funcSignature.find_last_of(')');
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   406
        
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   407
    if(openBracketIndex == string::npos || closeBracketIndex == string::npos )
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   408
    {     
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   409
        // No parameter list, so the given string may be for example 
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   410
        // "virtual table for MyClass"
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   411
        signature.nestedName = funcSignature;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   412
        return;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   413
    }
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   414
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   415
    // Remove preceding and trailing spaces from the function name part:
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   416
    string::const_iterator start;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   417
    string::const_iterator end = RemoveSpaces(  
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   418
                                    funcSignature.begin(), 
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   419
                                    funcSignature.begin() + openBracketIndex,
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   420
                                    start);
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   421
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   422
    // Store the name part
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   423
    signature.nestedName.append(start, end); 
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   424
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   425
    // Parse function parameters
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   426
    ParseParameterList(funcSignature, openBracketIndex+1, closeBracketIndex, signature.parameters);
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   427
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   428
    // Parse the cv-qualifier of the function.
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   429
    end = RemoveSpaces(funcSignature.begin() + (closeBracketIndex+1), funcSignature.end(), start);
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   430
    signature.cvQualifier.Set(string(start,end));
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   431
}
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   432
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   433
// ----------------------------------------------------------------------------------------------------------
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   434
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   435
/**
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   436
 * AreFunctionsCompatible
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   437
 * Compares two function signatures for backward binary compatibility. 
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   438
 * This function first parses the function signature into name, parameter list
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   439
 * and cv-qualifier parts. The name part is compared first and if names don't 
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   440
 * match, return false. Then parameter lists are given to 
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   441
 * <code>AreParametersCompatible</code> function for comparison. 
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   442
 * And finally cv-qualifiers of functions are compared. This comparison function
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   443
 * allows changing non-const function to const (i.e adding 'const'-qualifier for 
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   444
 * a function).
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   445
 * @param baselineFunc Reference to the string representing the baseline 
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   446
 *        platform's function signature
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   447
 * @param currentFunc Reference to the string representing the current
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   448
 *        platform's function signature
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   449
 * @return bool value indicating whether the two functions are backward binary
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   450
 *         compatible.
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   451
 */
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   452
TypeOfSeverity AreFunctionsCompatible(const string& baselineFunc, const string& currentFunc)
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   453
{ 
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   454
	TypeOfSeverity retSeverity = NO_BREAK;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   455
    // First split functions into name part, parameter list and possible cv-qualifier:
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   456
    FuncSignature baseFunc;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   457
    FuncSignature currFunc;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   458
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   459
    ParseFunctionSignature(baselineFunc, baseFunc);
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   460
    ParseFunctionSignature(currentFunc, currFunc);
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   461
    
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   462
      // Check the const qualifier of the function:
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   463
    if( baseFunc.cvQualifier.isConst != currFunc.cvQualifier.isConst )
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   464
	  {        
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   465
		    // const qualifier of the function has been removed(either const to non-const or vise versa)
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   466
		    // Results in SC break    
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   467
		    retSeverity = CONFIRMED_SC_BREAK;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   468
		goto EXIT_POINT;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   469
	  }
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   470
	  
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   471
	  // Check the number of parameters:
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   472
    if( baseFunc.parameters.size() != currFunc.parameters.size() )
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   473
    {
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   474
        retSeverity = POSSIBLE_BC_CONFIRMED_SC_BREAK; // Number of parameters does not match.
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   475
		goto EXIT_POINT;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   476
    }
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   477
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   478
    // Then check name part:
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   479
    if( baseFunc.nestedName.compare(currFunc.nestedName) != 0 )
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   480
    {     
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   481
        retSeverity = POSSIBLE_BC_SC_BREAK; // Names do not match.
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   482
		goto EXIT_POINT;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   483
    }
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   484
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   485
    // Check the parameters:       
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   486
    for( unsigned int i = 0; i < baseFunc.parameters.size(); ++i )
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   487
    {
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   488
        if( AreParametersCompatible(baseFunc.parameters[i], currFunc.parameters[i], COMPARE_FLAG_ALLOW_CONST_ADDITION) == false )
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   489
        {            
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   490
            retSeverity = POSSIBLE_BC_SC_BREAK; // Parameters do not match
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   491
			goto EXIT_POINT;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   492
        }
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   493
    }
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   494
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   495
    if( baseFunc.cvQualifier.isVolatile != currFunc.cvQualifier.isVolatile )
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   496
    {
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   497
        retSeverity = POSSIBLE_SC_BREAK; // volatile qualifier does not match
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   498
		goto EXIT_POINT;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   499
    }
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   500
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   501
EXIT_POINT:
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   502
    return retSeverity;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   503
}
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   504
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   505
// ----------------------------------------------------------------------------------------------------------
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   506
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   507
/**
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   508
 * Removes preceding and trailing spaces from the given string
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   509
 * @return iterator to the end of the trimmed string.
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   510
 * @param start Iterator to the beginning of the string.
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   511
 * @param end Iterator to the end of the string.
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   512
 * @param result Iterator to the beginning of the trimmed string. 
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   513
 */
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   514
string::const_iterator RemoveSpaces(string::const_iterator start, 
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   515
                                    string::const_iterator end, 
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   516
                                    string::const_iterator& result)
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   517
{
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   518
    // Remove spaces from the beginning of the string:
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   519
    result = start;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   520
    while( result != end && *result == ' ' )
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   521
    {
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   522
        ++result;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   523
    }
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   524
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   525
    // Remove spaces from the end of the string:
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   526
    string::const_iterator resultEnd = end;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   527
    while( resultEnd != result && *(resultEnd-1) == ' ' )
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   528
    {
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   529
        --resultEnd;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   530
    }
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   531
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   532
    return resultEnd;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   533
}
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   534
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   535
// ----------------------------------------------------------------------------------------------------------
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   536
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   537
/**
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   538
 * AreParametersCompatible
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   539
 * Checks if two function parameters are compatible with each other. 
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   540
 * Allows added const qualifiers in current version of the parameter.
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   541
 * This function loops through parameters, that are splitted into elements,
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   542
 * and compares them element by element. If the elements differ and current 
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   543
 * platform's element is 'const' qualifier, skip the current platform's element
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   544
 * and compare next one to the baseline platform's element. 
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   545
 * @param basePar Reference to the parameter object representing the parameter
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   546
 *        of the baseline platform's function.
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   547
 * @param currPar Reference to the parameter object representing the parameter
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   548
 *        of the current platform's function.
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   549
 * @param compareFlags Comparison policy flags that should be used when comparing
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   550
 *        the parameters. 
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   551
 * @return bool value indicating if the two parameters are backward binary compatible.
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   552
 */
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   553
bool AreParametersCompatible(   const FunctionParameter& basePar,
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   554
                                const FunctionParameter& currPar,
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   555
                                unsigned int compareFlags )
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   556
{      
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   557
    const string cvQualConst("const"); // const qualifier
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   558
    const string ptrStr("*"); // pointer
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   559
    const string refStr("&"); // reference
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   560
    if( basePar.size() > currPar.size() )
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   561
    {
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   562
        // Something has been removed:
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   563
        return false;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   564
    }
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   565
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   566
    vector<ParameterElement>::const_iterator baseElem = basePar.begin();
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   567
    vector<ParameterElement>::const_iterator currElem = currPar.begin();
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   568
    while( baseElem != basePar.end() && currElem != currPar.end() )
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   569
    {
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   570
        if( baseElem->Value().compare(currElem->Value()) != 0 )
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   571
        {
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   572
            if( currElem->Value().compare(cvQualConst) == 0 &&
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   573
                (compareFlags & COMPARE_FLAG_ALLOW_CONST_ADDITION) )
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   574
            {       
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   575
                // COMPARE_FLAG_ALLOW_CONST_ADDITION used, so it is acceptable that
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   576
                // 'const' qualifier has been added to current parameter. So let's skip
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   577
                // the 'const' qualifier -element and compare next elements to see if 
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   578
                // the parameter is otherwise compatible.
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   579
                ++currElem;             
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   580
                continue;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   581
            }
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   582
            else
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   583
            {
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   584
                return false; // Parameter elements do not match
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   585
            }
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   586
        }
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   587
        
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   588
        // Now, lets take the sub-parameters (if any) and call this function recursively:
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   589
        const ParameterList* baseSubPars = baseElem->SubParameters();
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   590
        const ParameterList* currSubPars = currElem->SubParameters();
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   591
        if( baseSubPars != 0 &&  currSubPars != 0 )
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   592
        {
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   593
            if( baseSubPars->size() != currSubPars->size() )
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   594
                return false; // Number of sub-parameters do not match
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   595
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   596
            for( unsigned int subI = 0; subI < baseSubPars->size(); ++subI )
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   597
            {
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   598
                // Here we are dealing with sub-parameters (e.g parameter list of a function 
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   599
                // pointer parameter), and no 'const addition' flags etc. are used anymore.
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   600
                if( AreParametersCompatible( baseSubPars->at(subI), currSubPars->at(subI)) == false )
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   601
                    return false;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   602
            }
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   603
        }
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   604
        else if( baseSubPars != currSubPars )
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   605
        {
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   606
            return false; // Other one's subparameter list pointer is NULL
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   607
        }
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   608
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   609
        ++baseElem;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   610
        ++currElem;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   611
    }
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   612
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   613
    // Check for the const pointer. Actually in this case the 'const' qualifier
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   614
    // is left out from the mangled/demangled signature, but just to be sure...
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   615
    // For example: 'int *' changed to 'int * const'
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   616
    if( baseElem == basePar.end() && currElem != currPar.end() )
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   617
    {
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   618
        if( currElem->Value().compare(cvQualConst) == 0 )
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   619
        {            
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   620
            ++currElem;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   621
        }
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   622
    }
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   623
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   624
    // Check that all the elements have been "consumed":
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   625
    return baseElem == basePar.end() && currElem == currPar.end();
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   626
}
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   627
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   628
// ----------------------------------------------------------------------------------------------------------