dbertoni    01/07/08 11:20:36

  Modified:    c/src/XPath XPathExpression.hpp XPathExpression.cpp
  Log:
  Use static table for op code lengths.
  
  Revision  Changes    Path
  1.20      +65 -110   xml-xalan/c/src/XPath/XPathExpression.hpp
  
  Index: XPathExpression.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/XPathExpression.hpp,v
  retrieving revision 1.19
  retrieving revision 1.20
  diff -u -r1.19 -r1.20
  --- XPathExpression.hpp       2001/06/14 19:12:18     1.19
  +++ XPathExpression.hpp       2001/07/08 18:20:35     1.20
  @@ -64,9 +64,6 @@
   
   
   
  -#include <deque>
  -#include <map>
  -#include <set>
   #include <vector>
   
   #if defined(XALAN_NO_IOSFWD)
  @@ -120,10 +117,11 @@
        enum eOpCodes
        {
                /**
  -              * [ENDOP]
  -              * Some operators may like to have a terminator.
  +              * [ELEMWILDCARD]
  +              * Means ELEMWILDCARD ("*"), used instead 
  +              * of string index in some places.
                 */
  -             eENDOP = -1,
  +             eELEMWILDCARD = -3,
   
                /**
                 * [EMPTY]
  @@ -132,11 +130,10 @@
                eEMPTY = -2,
   
                /**
  -              * [ELEMWILDCARD]
  -              * Means ELEMWILDCARD ("*"), used instead 
  -              * of string index in some places.
  +              * [ENDOP]
  +              * Some operators may like to have a terminator.
                 */
  -             eELEMWILDCARD = -3,
  +             eENDOP = -1,
   
                /**
                 * [OP_XPATH]
  @@ -297,18 +294,6 @@
                eOP_MOD = 14,
   
                /**
  -              * [OP_QUO]
  -              * [length]
  -              *      {number expression}
  -              *      {number expression}
  -              * 
  -              * returns: 
  -              *      XNumber
  -              */
  -// No longer supported...
  -//           eOP_QUO = 15,
  -
  -             /**
                 * [OP_NEG]
                 * [length]
                 *      {number expression}
  @@ -316,38 +301,17 @@
                 * returns: 
                 *      XNumber
                 */
  -             eOP_NEG = 16,
  +             eOP_NEG = 15,
   
                /**
  -              * [OP_STRING] (cast operation)
  -              * [length]
  -              *      {expression}
  -              * 
  -              * returns: 
  -              *      XString
  -              */
  -// No longer supported...
  -//           eOP_STRING = 17,
  -
  -             /**
                 * [OP_BOOL] (cast operation)
                 * [length]
                 *      {expression}
                 * 
                 * returns: 
                 *      XBoolean
  -              */
  -             eOP_BOOL = 18,
  -
  -             /**
  -              * [OP_NUMBER] (cast operation)
  -              * [length]
  -              *      {expression}
  -              * 
  -              * returns: 
  -              *      XBoolean
                 */
  -             eOP_NUMBER = 19,
  +             eOP_BOOL = 16,
   
                /**
                 * [OP_UNION]
  @@ -357,7 +321,7 @@
                 * returns: 
                 *      XNodeSet
                 */
  -             eOP_UNION = 20,
  +             eOP_UNION = 17,
   
                /**
                 * [OP_LITERAL]
  @@ -367,7 +331,7 @@
                 * returns: 
                 *      XString
                 */
  -             eOP_LITERAL = 21,
  +             eOP_LITERAL = 18,
   
                /**
                 * [OP_VARIABLE]
  @@ -377,7 +341,7 @@
                 * returns: 
                 *      XString
                 */
  -             eOP_VARIABLE = 22,
  +             eOP_VARIABLE = 19,
   
                /**
                 * [OP_GROUP]
  @@ -392,7 +356,7 @@
                 *      XRTree
                 *      XObject
                 */
  -             eOP_GROUP = 23,
  +             eOP_GROUP = 20,
   
                /**
                 * [OP_NUMBERLIT] (Number literal.)
  @@ -402,7 +366,7 @@
                 * returns: 
                 *      XString
                 */
  -             eOP_NUMBERLIT = 24,
  +             eOP_NUMBERLIT = 21,
   
                /**
                 * [OP_ARGUMENT] (Function argument.)
  @@ -417,7 +381,7 @@
                 *      XRTree
                 *      XObject
                 */
  -             eOP_ARGUMENT = 25,
  +             eOP_ARGUMENT = 22,
   
                /**
                 * [OP_EXTFUNCTION] (Extension function.)
  @@ -434,7 +398,7 @@
                 *  XRTree
                 *  XObject
                 */
  -             eOP_EXTFUNCTION = 26,
  +             eOP_EXTFUNCTION = 23,
   
                /**
                 * [OP_FUNCTION]
  @@ -451,7 +415,7 @@
                 *  XRTree
                 *  XObject
                 */
  -             eOP_FUNCTION = 27,
  +             eOP_FUNCTION = 24,
   
                /**
                 * [OP_LOCATIONPATH]
  @@ -466,7 +430,7 @@
                 * returns: 
                 *      XNodeSet
                 */
  -             eOP_LOCATIONPATH = 28,
  +             eOP_LOCATIONPATH = 25,
   
                /**
                 * [OP_PREDICATE]
  @@ -477,7 +441,7 @@
                 * returns: 
                 *      XBoolean or XNumber
                 */
  -             eOP_PREDICATE = 29,
  +             eOP_PREDICATE = 26,
     
                /**
                 * [NODETYPE_COMMENT]
  @@ -486,7 +450,7 @@
                 * returns: 
                 *      XBoolean
                 */
  -             eNODETYPE_COMMENT = 1030,
  +             eNODETYPE_COMMENT = 27,
                
                /**
                 * [NODETYPE_TEXT]
  @@ -495,7 +459,7 @@
                 * returns: 
                 *      XBoolean
                 */
  -             eNODETYPE_TEXT = 1031,
  +             eNODETYPE_TEXT = 28,
                
                /**
                 * [NODETYPE_PI]
  @@ -504,7 +468,7 @@
                 * returns: 
                 *      XBoolean
                 */
  -             eNODETYPE_PI = 1032,
  +             eNODETYPE_PI = 29,
                
                /**
                 * [NODETYPE_NODE]
  @@ -513,7 +477,7 @@
                 * returns: 
                 *      XBoolean
                 */
  -             eNODETYPE_NODE = 1033,
  +             eNODETYPE_NODE = 30,
                
                /**
                 * [NODENAME]
  @@ -523,7 +487,7 @@
                 * returns: 
                 *      XBoolean
                 */
  -             eNODENAME = 34,
  +             eNODENAME = 31,
                
                /**
                 * [NODETYPE_ROOT]
  @@ -532,7 +496,7 @@
                 * returns: 
                 *      XBoolean
                 */
  -             eNODETYPE_ROOT = 35,
  +             eNODETYPE_ROOT = 32,
                
                /**
                 * [NODETYPE_ANY]
  @@ -541,7 +505,7 @@
                 * returns: 
                 *      XBoolean
                 */
  -             eNODETYPE_ANYELEMENT = 36,
  +             eNODETYPE_ANYELEMENT = 33,
   
                /**
                 * [FROM_stepType]
  @@ -553,25 +517,20 @@
                 * returns: 
                 *      XBoolean
                 */
  -             eFROM_ANCESTORS = 37,
  -             eFROM_ANCESTORS_OR_SELF = 38,
  -             eFROM_ATTRIBUTES = 39,
  -             eFROM_CHILDREN = 40,
  -             eFROM_DESCENDANTS = 41,
  -             eFROM_DESCENDANTS_OR_SELF = 42,
  -             eFROM_FOLLOWING = 43,
  -             eFROM_FOLLOWING_SIBLINGS = 44,
  -             eFROM_PARENT = 45,
  -             eFROM_PRECEDING = 46,
  -             eFROM_PRECEDING_SIBLINGS = 47,
  -             eFROM_SELF = 48,
  -             eFROM_NAMESPACE = 49,
  -             // eFROM_ATTRIBUTE = 50,
  -             // eFROM_DOC = 51,
  -             // eFROM_DOCREF = 52,
  -             // eFROM_ID = 53,
  -             // eFROM_IDREF = 54,
  -             eFROM_ROOT = 55,
  +             eFROM_ANCESTORS = 34,
  +             eFROM_ANCESTORS_OR_SELF = 35,
  +             eFROM_ATTRIBUTES = 36,
  +             eFROM_CHILDREN = 37,
  +             eFROM_DESCENDANTS = 38,
  +             eFROM_DESCENDANTS_OR_SELF = 39,
  +             eFROM_FOLLOWING = 40,
  +             eFROM_FOLLOWING_SIBLINGS = 41,
  +             eFROM_PARENT = 42,
  +             eFROM_PRECEDING = 43,
  +             eFROM_PRECEDING_SIBLINGS = 44,
  +             eFROM_SELF = 45,
  +             eFROM_NAMESPACE = 46,
  +             eFROM_ROOT = 47,
   
                /**
                 * [OP_UNION]
  @@ -581,7 +540,7 @@
                 * returns: 
                 *  XNodeSet
                 */
  -             eOP_MATCHPATTERN = 92,
  +             eOP_MATCHPATTERN = 48,
   
                /**
                 * [OP_UNION]
  @@ -591,16 +550,17 @@
                 * returns: 
                 *  XNodeSet
                 */
  -             eOP_LOCATIONPATHPATTERN = 93,
  +             eOP_LOCATIONPATHPATTERN = 49,
   
                // For match patterns
  -             eMATCH_ATTRIBUTE = 94,
  -             eMATCH_ANY_ANCESTOR = 95,
  -             eMATCH_IMMEDIATE_ANCESTOR = 96,
  -             eMATCH_ANY_ANCESTOR_WITH_PREDICATE = 97,
  -             eMATCH_ANY_ANCESTOR_WITH_FUNCTION_CALL = 98,
  +             eMATCH_ATTRIBUTE = 50,
  +             eMATCH_ANY_ANCESTOR = 51,
  +             eMATCH_IMMEDIATE_ANCESTOR = 52,
  +             eMATCH_ANY_ANCESTOR_WITH_PREDICATE = 53,
  +             eMATCH_ANY_ANCESTOR_WITH_FUNCTION_CALL = 54,
   
  -             // Always add _before_ this one.
  +             // Always add _before_ this one and update
  +             // s_opCodeLengthArray.
                eOpCodeNextAvailable
        };      // enum eOpCodes
   
  @@ -611,11 +571,11 @@
         * remain one.
         */
   #if defined(XALAN_INLINE_INITIALIZATION)
  -     const int       s__opCodeMapLengthIndex = 1;
  +     const int       s_opCodeMapLengthIndex = 1;
   #else
        enum eDummy
        {
  -             s__opCodeMapLengthIndex = 1
  +             s_opCodeMapLengthIndex = 1
        };
   #endif
   
  @@ -750,8 +710,6 @@
        typedef vector<XToken>                                  TokenQueueType;
        typedef vector<int>                                             
PatternMapType;
   
  -     typedef map<int, int, less<int> >               OpCodeLengthMapType;
  -
        typedef OpCodeMapType::value_type               OpCodeMapValueType;
        typedef OpCodeMapType::size_type                OpCodeMapSizeType;
   
  @@ -763,7 +721,6 @@
        typedef std::vector<int>                                OpCodeMapType;
        typedef std::vector<XToken>                             TokenQueueType;
        typedef std::vector<int>                                PatternMapType;
  -     typedef std::map<int, int>                              
OpCodeLengthMapType;
   
        typedef OpCodeMapType::value_type               OpCodeMapValueType;
        typedef OpCodeMapType::size_type                OpCodeMapSizeType;
  @@ -822,12 +779,12 @@
        {
                const OpCodeMapSizeType         theSize = opCodeMapSize();
   
  -             if (theSize > s__opCodeMapLengthIndex)
  +             if (theSize > s_opCodeMapLengthIndex)
                {
                        assert(theSize ==
  -                             
OpCodeMapSizeType(m_opMap[s__opCodeMapLengthIndex]));
  +                             
OpCodeMapSizeType(m_opMap[s_opCodeMapLengthIndex]));
   
  -                     return m_opMap[s__opCodeMapLengthIndex];
  +                     return m_opMap[s_opCodeMapLengthIndex];
                }
                else
                {
  @@ -870,15 +827,21 @@
                return m_opMap[opPos];
        }
   
  +     OpCodeMapValueType
  +     getOpCodeArgumentLength(OpCodeMapSizeType       opPos) const
  +     {
  +             return getOpCodeMapValue(opPos + 
XPathExpression::s_opCodeMapLengthIndex + 1) - 3;
  +     }
  +
        /**
         * Retrieve the length of an operation code at a specified position in 
the
  -      * list.
  +      * op map.
         * 
  -      * @param opPos position in list
  +      * @param opPos position in the op map
         * @return length of operation code
         */
        OpCodeMapValueType
  -     getOpCodeLength(OpCodeMapSizeType       opPos) const;
  +     getOpCodeLengthFromOpMap(OpCodeMapSizeType      opPos) const;
   
        /**
         * Retrieve the position of the next operation code at a specified 
position
  @@ -892,7 +855,7 @@
        {
                assert(opPos < opCodeMapSize());
   
  -             return opPos + m_opMap[opPos + s__opCodeMapLengthIndex];
  +             return opPos + m_opMap[opPos + s_opCodeMapLengthIndex];
        }
   
        /**
  @@ -1314,7 +1277,7 @@
                m_opMap.push_back(theValue);
   
                // Update the op map length.
  -             m_opMap[s__opCodeMapLengthIndex]++;
  +             m_opMap[s_opCodeMapLengthIndex]++;
        }
   
        /**
  @@ -1493,14 +1456,6 @@
        };
   
        NumberLiteralValueVectorType    m_numberLiteralValues;
  -
  -     // A map of Op codes to op code lengths.
  -     const static OpCodeLengthMapType        s_opCodeLengths;
  -
  -     static OpCodeLengthMapType
  -     IntializeOpCodeLengthMap();
  -
  -     const static bool       s_nodeTestOpCodesArray[];
   };
   
   
  
  
  
  1.32      +142 -147  xml-xalan/c/src/XPath/XPathExpression.cpp
  
  Index: XPathExpression.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/XPathExpression.cpp,v
  retrieving revision 1.31
  retrieving revision 1.32
  diff -u -r1.31 -r1.32
  --- XPathExpression.cpp       2001/06/14 19:12:16     1.31
  +++ XPathExpression.cpp       2001/07/08 18:20:35     1.32
  @@ -82,29 +82,117 @@
   
   
   
  -const XPathExpression::OpCodeLengthMapType   
XPathExpression::s_opCodeLengths =
  -                             XPathExpression::IntializeOpCodeLengthMap();
  +// This is an array which indicates which of the value defined by
  +// XPathExpression::eOpCodes are node tests.
  +static const bool    theNodeTestOpCodesArray[] =
  +{
  +     false, false, true,  false, false, false, false, false, false, false,
  +     false, false, false, false, false, false, false, false, false, false,
  +     false, false, false, false, false, false, false, false, false, false,
  +     false, false, false, false, true,  true,  true,  true,  true,  true,
  +     true,  true,  true,  true,  true,  true,  true,  false, false, false, 
  +     true,  true,  true
  +};
   
  +static const unsigned int    theNodeTestOpCodesArraySize =
  +             sizeof(theNodeTestOpCodesArray) / 
sizeof(theNodeTestOpCodesArray[0]);
   
   
  -const unsigned int   s_nodeTestOpCodesArraySize = 100;
  +// This is an array for all of the opcode defined by 
XPathExpression::eOpCodes.
  +// It is offset by 3, because there opcode values are -3, -2, and -1.  So,
  +// when getting the length of an opcode, we add three to get the correct 
index.
  +static const int     theOpCodeLengthArray[] =
  +{
  +     1,
  +     1,
  +     1,
  +
  +     0,
  +     XPathExpression::s_opCodeMapLengthIndex + 1,
  +     XPathExpression::s_opCodeMapLengthIndex + 1,
  +     XPathExpression::s_opCodeMapLengthIndex + 1,
  +     XPathExpression::s_opCodeMapLengthIndex + 1,
  +     XPathExpression::s_opCodeMapLengthIndex + 1,
  +     XPathExpression::s_opCodeMapLengthIndex + 1,
  +     XPathExpression::s_opCodeMapLengthIndex + 1,
  +     XPathExpression::s_opCodeMapLengthIndex + 1,
  +     XPathExpression::s_opCodeMapLengthIndex + 1,
  +
  +     XPathExpression::s_opCodeMapLengthIndex + 1,
  +     XPathExpression::s_opCodeMapLengthIndex + 1,
  +     XPathExpression::s_opCodeMapLengthIndex + 1,
  +     XPathExpression::s_opCodeMapLengthIndex + 1,
  +     XPathExpression::s_opCodeMapLengthIndex + 1,
  +     XPathExpression::s_opCodeMapLengthIndex + 1,
  +     XPathExpression::s_opCodeMapLengthIndex + 1,
  +     XPathExpression::s_opCodeMapLengthIndex + 1,
  +     XPathExpression::s_opCodeMapLengthIndex + 1,
  +     XPathExpression::s_opCodeMapLengthIndex + 1,
  +
  +     XPathExpression::s_opCodeMapLengthIndex + 1,
  +     XPathExpression::s_opCodeMapLengthIndex + 1,
  +     XPathExpression::s_opCodeMapLengthIndex + 1,
  +     XPathExpression::s_opCodeMapLengthIndex + 3,
  +     XPathExpression::s_opCodeMapLengthIndex + 3,
  +     XPathExpression::s_opCodeMapLengthIndex + 1,
  +     XPathExpression::s_opCodeMapLengthIndex + 1,
  +     1,
  +     1,
  +
  +     1,
  +     1,
  +     1,
  +     1,
  +     1,
  +     XPathExpression::s_opCodeMapLengthIndex + 2,
  +     XPathExpression::s_opCodeMapLengthIndex + 2,
  +     XPathExpression::s_opCodeMapLengthIndex + 2,
  +     XPathExpression::s_opCodeMapLengthIndex + 2,
  +     XPathExpression::s_opCodeMapLengthIndex + 2,
  +
  +     XPathExpression::s_opCodeMapLengthIndex + 2,
  +     XPathExpression::s_opCodeMapLengthIndex + 2,
  +     XPathExpression::s_opCodeMapLengthIndex + 2,
  +     XPathExpression::s_opCodeMapLengthIndex + 2,
  +     XPathExpression::s_opCodeMapLengthIndex + 2,
  +     XPathExpression::s_opCodeMapLengthIndex + 2,
  +     XPathExpression::s_opCodeMapLengthIndex + 2,
  +     XPathExpression::s_opCodeMapLengthIndex + 2,
  +     XPathExpression::s_opCodeMapLengthIndex + 2,
  +     XPathExpression::s_opCodeMapLengthIndex + 1,
  +
  +     XPathExpression::s_opCodeMapLengthIndex + 1,
  +     XPathExpression::s_opCodeMapLengthIndex + 1,
  +     XPathExpression::s_opCodeMapLengthIndex + 1,
  +     XPathExpression::s_opCodeMapLengthIndex + 1,
  +     XPathExpression::s_opCodeMapLengthIndex + 2,
  +     XPathExpression::s_opCodeMapLengthIndex + 2
  +};
  +
  +static const int     theOpCodeLengthArraySize =
  +             sizeof(theOpCodeLengthArray) / sizeof(theOpCodeLengthArray[0]);
  +
   
   
  -const bool   XPathExpression::s_nodeTestOpCodesArray[] =
  +inline int
  +getOpCodeLength(int          theOpCode)
   {
  -     false, false, true,  false, false, false, false, false, false, false,
  -     false, false, false, false, false, false, false, false, false, false,
  -     false, false, false, false, false, false, false, false, false, false,
  -     false, false, false, false, false, false, false, true,  true,  true,
  -     true,  true,  true,  true,  true,  true,  true,  true,  true,  true,
  -     false, false, false, false, false, false, false, false, false, false,
  -     false, false, false, false, false, false, false, false, false, false,
  -     false, false, false, false, false, false, false, false, false, false,
  -     false, false, false, false, false, false, false, false, false, false,
  -     false, false, false, false, true,  true,  true,  false, false, false
  -};
  +     assert(theOpCodeLengthArraySize == 
XPathExpression::eOpCodeNextAvailable + 3);
   
  +     // Add 3 to get the correct index into the array...
  +     theOpCode += 3;
   
  +     if (theOpCode < 0 || theOpCode >= theOpCodeLengthArraySize)
  +     {
  +             return 0;
  +     }
  +     else
  +     {
  +             return theOpCodeLengthArray[theOpCode];
  +     }
  +}
  +
  +
   
   XPathExpression::XPathExpressionException::XPathExpressionException(const 
XalanDOMString&    theMessage) :
        XPathException(theMessage)
  @@ -326,7 +414,7 @@
   
   
   XPathExpression::OpCodeMapValueType
  -XPathExpression::getOpCodeLength(OpCodeMapSizeType   opPos) const
  +XPathExpression::getOpCodeLengthFromOpMap(OpCodeMapSizeType          opPos) 
const
   {
        OpCodeMapValueType      theResult = 0;
   
  @@ -337,20 +425,19 @@
        else
        {
                // Is there a valid opcode?
  -             OpCodeLengthMapType::const_iterator             i =
  -                                     s_opCodeLengths.find(m_opMap[opPos]);
  +             const int       theOpCodeLength = 
getOpCodeLength(m_opMap[opPos]);
   
  -             if (i == s_opCodeLengths.end())
  +             if (theOpCodeLength == 0)
                {
                        throw InvalidOpCodeException(-1);
                }
                else
                {
                        // Does the Op code have a length > 1?
  -                     if ((*i).second > 1)
  +                     if (theOpCodeLength > 1)
                        {
                                // Yes, so get the length.
  -                             theResult = m_opMap[opPos + 
s__opCodeMapLengthIndex];
  +                             theResult = m_opMap[opPos + 
s_opCodeMapLengthIndex];
                        }
                }
        }
  @@ -370,27 +457,24 @@
        // and the length indicator.
        assert(opCodeMapSize() > theIndex + 1);
   
  -     OpCodeLengthMapType::const_iterator     i =
  -                     s_opCodeLengths.find(theOpCode);
  +     const int       theOpCodeLength = getOpCodeLength(theOpCode);
   
        // Make sure it's a valid op code and that it
        // matches the op code at supplied index.
  -     if (i == s_opCodeLengths.end() ||
  +     if (theOpCodeLength == 0 ||
                m_opMap[theIndex] != theOpCode)
        {
                throw InvalidOpCodeException(theOpCode);
        }
        else
        {
  -             assert((*i).second > 0);
  -
                const OpCodeMapSizeType         theArgCount =
  -                             (*i).second - 1 - s__opCodeMapLengthIndex;
  +                             theOpCodeLength - 1 - s_opCodeMapLengthIndex;
   
                if (theArgCount != theArgs.size())
                {
                        throw InvalidArgumentCountException(theOpCode,
  -                                                                             
                (*i).second,
  +                                                                             
                theOpCodeLength,
                                                                                
                theArgCount);
                }
                else
  @@ -406,7 +490,7 @@
                                }
                                else
                                {
  -                                     m_opMap[i + theIndex + 
s__opCodeMapLengthIndex + 1] =
  +                                     m_opMap[i + theIndex + 
s_opCodeMapLengthIndex + 1] =
                                                theArgs[i];
                                }
                        }
  @@ -419,36 +503,28 @@
   void
   XPathExpression::appendOpCode(eOpCodes       theOpCode)
   {
  -     OpCodeLengthMapType::const_iterator     i =
  -                     s_opCodeLengths.find(theOpCode);
  +     const int       theOpCodeLength = getOpCodeLength(theOpCode);
   
  -     if (i == s_opCodeLengths.end())
  +     if (theOpCodeLength == 0)
        {
                throw InvalidOpCodeException(theOpCode);
        }
        else
        {
  -             assert((*i).second > 0);
  -
                // Set the current index before pushing, by
  -             // getting the size, which will be correct
  +             // getting the length, which will be correct
                // after the push.
                m_lastOpCodeIndex = opCodeMapSize();
   
                m_opMap.push_back(theOpCode);
   
  -             assert(s__opCodeMapLengthIndex == 1);
  +             assert(s_opCodeMapLengthIndex == 1);
   
  -             const OpCodeMapSizeType theSize =
  -                                     (*i).second;
  -
  -             if (theSize > 1)
  +             if (theOpCodeLength > 1)
                {
  -                     m_opMap.push_back(theSize);
  +                     m_opMap.push_back(theOpCodeLength);
   
  -                     for (OpCodeMapSizeType  i = 2;
  -                                             i < theSize;
  -                                                             i++)
  +                     for (int i = 2; i < theOpCodeLength; ++i)
                        {
                                m_opMap.push_back(eENDOP);
                        }
  @@ -456,7 +532,7 @@
   
                if (m_lastOpCodeIndex != 0)
                {
  -                     m_opMap[s__opCodeMapLengthIndex] += theSize;
  +                     m_opMap[s_opCodeMapLengthIndex] += theOpCodeLength;
                }
        }
   
  @@ -470,19 +546,16 @@
                        eOpCodes                        theOpCode,
                        OpCodeMapSizeType       theIndex)
   {
  -     OpCodeLengthMapType::const_iterator     i =
  -                             s_opCodeLengths.find(theOpCode);
  +     const int       theOpCodeLength = getOpCodeLength(theOpCode);
   
  -     if (i == s_opCodeLengths.end())
  +     if (theOpCodeLength == 0)
        {
                throw InvalidOpCodeException(theOpCode);
        }
        else
        {
  -             assert((*i).second > 0);
  -
                // Insert -1 for each element of the opcode.
  -             m_opMap.insert(m_opMap.begin() + theIndex, (*i).second, -1);
  +             m_opMap.insert(m_opMap.begin() + theIndex, theOpCodeLength, -1);
   
                // Set the member that contains the last insert/appended
                // index.
  @@ -492,10 +565,10 @@
                m_opMap[theIndex] = theOpCode;
   
                // Update the entire expression length.
  -             m_opMap[s__opCodeMapLengthIndex] += (*i).second;
  +             m_opMap[s_opCodeMapLengthIndex] += theOpCodeLength;
        }
   
  -     return (*i).second;
  +     return theOpCodeLength;
   }
   
   
  @@ -512,24 +585,21 @@
   
        assert(theNewIndex > theOriginalIndex);
   
  -     OpCodeLengthMapType::const_iterator     i =
  -                     s_opCodeLengths.find(theOpCode);
  +     const int       theOpCodeLength = getOpCodeLength(theOpCode);
   
        // Make sure it's a valid op code and that it
        // matches the op code at supplied index.
  -     if (i == s_opCodeLengths.end() ||
  +     if (theOpCodeLength == 0 ||
                m_opMap[theNewIndex] != theOpCode)
        {
                throw InvalidOpCodeException(theOpCode);
        }
        else
        {
  -             assert((*i).second > 0);
  -
                // Determine where the length position of the op code
                // is.
                const   OpCodeMapSizeType       theLengthIndex =
  -                                             theNewIndex + 
s__opCodeMapLengthIndex;
  +                                             theNewIndex + 
s_opCodeMapLengthIndex;
   
                // Too long, then throw an exception.
                if (theLengthIndex >= opCodeMapSize())
  @@ -546,7 +616,7 @@
                        // adding that size in.
                        if (theNextOpCodePosition < opCodeMapSize())
                        {
  -                             m_opMap[theLengthIndex] += 
getOpCodeLength(theNextOpCodePosition);
  +                             m_opMap[theLengthIndex] += 
getOpCodeLengthFromOpMap(theNextOpCodePosition);
                        }
                }
        }
  @@ -563,27 +633,24 @@
        // the buffer...
        assert(opCodeMapSize() > theIndex + 1);
   
  -     OpCodeLengthMapType::const_iterator     i =
  -                             s_opCodeLengths.find(theOpCode);
  +     const int       theOpCodeLength = getOpCodeLength(theOpCode);
   
        // Make sure it's a valid op code and that it
        // matches the op code at supplied index.
  -     if (i == s_opCodeLengths.end() ||
  +     if (theOpCodeLength == 0 ||
                m_opMap[theIndex] != theOpCode)
        {
                throw InvalidOpCodeException(theOpCode);
        }
        else
        {
  -             assert((*i).second > 0);
  -
                // This presumes that the other opcodes
                // have been appended to the expression,
                // and that the specified op code's length
                // needs to be set.  The size includes the
                // normal length of the opcode, plus the
                // length of its subexpressions.
  -             m_opMap[theIndex + s__opCodeMapLengthIndex] =
  +             m_opMap[theIndex + s_opCodeMapLengthIndex] =
                                                        opCodeMapLength() - 
theIndex;
        }
   }
  @@ -593,9 +660,9 @@
   bool
   XPathExpression::isNodeTestOpCode(OpCodeMapValueType theOpCode)
   {
  -     if (theOpCode < s_nodeTestOpCodesArraySize)
  +     if (theOpCode < theNodeTestOpCodesArraySize)
        {
  -             return s_nodeTestOpCodesArray[theOpCode];
  +             return theNodeTestOpCodesArray[theOpCode];
        }
        else
        {
  @@ -615,21 +682,18 @@
        const OpCodeMapValueType        theOpCode =
                                                m_opMap[theIndex];
   
  -     OpCodeLengthMapType::const_iterator     i =
  -                             s_opCodeLengths.find(theOpCode);
  +     const int       theOpCodeLength = getOpCodeLength(theOpCode);
   
        // Make sure it's a valid op code and that it
        // is a node test op code.
  -     if (i == s_opCodeLengths.end() ||
  +     if (theOpCodeLength == 0 ||
                isNodeTestOpCode(theOpCode) == false)
        {
                throw InvalidOpCodeException(theOpCode);
        }
        else
        {
  -             assert((*i).second > 0);
  -
  -             m_opMap[theIndex + s__opCodeMapLengthIndex + 1] =
  +             m_opMap[theIndex + s_opCodeMapLengthIndex + 1] =
                                                        opCodeMapLength() - 
theIndex;
        }
   }
  @@ -762,7 +826,7 @@
        m_opMap.push_back(thePosition);
   
        // Update the op map length.
  -     m_opMap[s__opCodeMapLengthIndex]++;
  +     m_opMap[s_opCodeMapLengthIndex]++;
   }
   
   
  @@ -783,7 +847,7 @@
        m_opMap.push_back(thePosition);
   
        // Update the op map length.
  -     m_opMap[s__opCodeMapLengthIndex]++;
  +     m_opMap[s_opCodeMapLengthIndex]++;
   }
   
   
  @@ -800,7 +864,7 @@
        m_opMap.push_back(theIndex);
   
        // Update the op map length.
  -     m_opMap[s__opCodeMapLengthIndex]++;
  +     m_opMap[s_opCodeMapLengthIndex]++;
   
        m_numberLiteralValues.push_back(theNumber);
   }
  @@ -820,74 +884,5 @@
        m_opMap.push_back(thePosition);
   
        // Update the op map length.
  -     m_opMap[s__opCodeMapLengthIndex]++;
  -}
  -
  -
  -
  -XPathExpression::OpCodeLengthMapType
  -XPathExpression::IntializeOpCodeLengthMap()
  -{
  -     OpCodeLengthMapType             theMap;
  -
  -     theMap[eENDOP] = 1;
  -     theMap[eEMPTY] = 1;
  -     theMap[eELEMWILDCARD] = 1;
  -     theMap[eOP_XPATH] = 1 + s__opCodeMapLengthIndex;
  -     theMap[eOP_OR] = 1 + s__opCodeMapLengthIndex;
  -     theMap[eOP_AND] = 1 + s__opCodeMapLengthIndex;
  -     theMap[eOP_NOTEQUALS] = 1 + s__opCodeMapLengthIndex;
  -     theMap[eOP_EQUALS] = 1 + s__opCodeMapLengthIndex;
  -     theMap[eOP_LTE] = 1 + s__opCodeMapLengthIndex;
  -     theMap[eOP_LT] = 1 + s__opCodeMapLengthIndex;
  -     theMap[eOP_GTE] = 1 + s__opCodeMapLengthIndex;
  -     theMap[eOP_GT] = 1 + s__opCodeMapLengthIndex;
  -     theMap[eOP_PLUS] = 1 + s__opCodeMapLengthIndex;
  -     theMap[eOP_MINUS] = 1 + s__opCodeMapLengthIndex;
  -     theMap[eOP_MULT] = 1 + s__opCodeMapLengthIndex;
  -     theMap[eOP_DIV] = 1 + s__opCodeMapLengthIndex;
  -     theMap[eOP_MOD] = 1 + s__opCodeMapLengthIndex;
  -     theMap[eOP_NEG] = 1 + s__opCodeMapLengthIndex;
  -     theMap[eOP_BOOL] = 1 + s__opCodeMapLengthIndex;
  -     theMap[eOP_NUMBER] = 1 + s__opCodeMapLengthIndex;
  -     theMap[eOP_UNION] = 1 + s__opCodeMapLengthIndex;
  -     theMap[eOP_LITERAL] = 1 + s__opCodeMapLengthIndex;
  -     theMap[eOP_VARIABLE] = 1 + s__opCodeMapLengthIndex;
  -     theMap[eOP_GROUP] = 1 + s__opCodeMapLengthIndex;
  -     theMap[eOP_NUMBERLIT] = 1 + s__opCodeMapLengthIndex;
  -     theMap[eOP_ARGUMENT] = 1 + s__opCodeMapLengthIndex;
  -     theMap[eOP_EXTFUNCTION] = 3 + s__opCodeMapLengthIndex;
  -     theMap[eOP_FUNCTION] = 3 + s__opCodeMapLengthIndex;
  -     theMap[eOP_LOCATIONPATH] = 1 + s__opCodeMapLengthIndex;
  -     theMap[eOP_PREDICATE] = 1 + s__opCodeMapLengthIndex;
  -     theMap[eNODETYPE_COMMENT] = 1;
  -     theMap[eNODETYPE_TEXT] = 1;
  -     theMap[eNODETYPE_PI] = 1;
  -     theMap[eNODETYPE_NODE] = 1;
  -     theMap[eNODENAME] = 1;
  -     theMap[eNODETYPE_ROOT] = 1;
  -     theMap[eNODETYPE_ANYELEMENT] = 1;
  -     theMap[eFROM_ANCESTORS] = 2 + s__opCodeMapLengthIndex;
  -     theMap[eFROM_ANCESTORS_OR_SELF] = 2 + s__opCodeMapLengthIndex;
  -     theMap[eFROM_ATTRIBUTES] = 2 + s__opCodeMapLengthIndex;
  -     theMap[eFROM_CHILDREN] = 2 + s__opCodeMapLengthIndex;
  -     theMap[eFROM_DESCENDANTS] = 2 + s__opCodeMapLengthIndex;
  -     theMap[eFROM_DESCENDANTS_OR_SELF] = 2 + s__opCodeMapLengthIndex;
  -     theMap[eFROM_FOLLOWING] = 2 + s__opCodeMapLengthIndex;
  -     theMap[eFROM_FOLLOWING_SIBLINGS] = 2 + s__opCodeMapLengthIndex;
  -     theMap[eFROM_PARENT] = 2 + s__opCodeMapLengthIndex;
  -     theMap[eFROM_PRECEDING] = 2 + s__opCodeMapLengthIndex;
  -     theMap[eFROM_PRECEDING_SIBLINGS] = 2 + s__opCodeMapLengthIndex;
  -     theMap[eFROM_SELF] = 2 + s__opCodeMapLengthIndex;
  -     theMap[eFROM_NAMESPACE] = 2 + s__opCodeMapLengthIndex;
  -     theMap[eFROM_ROOT] = 2 + s__opCodeMapLengthIndex;
  -     theMap[eOP_MATCHPATTERN] = 1 + s__opCodeMapLengthIndex;
  -     theMap[eOP_LOCATIONPATHPATTERN] = 1 + s__opCodeMapLengthIndex;
  -     theMap[eMATCH_ATTRIBUTE] = 1 + s__opCodeMapLengthIndex;
  -     theMap[eMATCH_ANY_ANCESTOR] = 1 + s__opCodeMapLengthIndex;
  -     theMap[eMATCH_IMMEDIATE_ANCESTOR] = 1 + s__opCodeMapLengthIndex;
  -     theMap[eMATCH_ANY_ANCESTOR_WITH_PREDICATE] = 2 + 
s__opCodeMapLengthIndex;
  -     theMap[eMATCH_ANY_ANCESTOR_WITH_FUNCTION_CALL] = 2 + 
s__opCodeMapLengthIndex;
  -
  -     return theMap;
  +     m_opMap[s_opCodeMapLengthIndex]++;
   }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to