nsMathMLOperators.h (7204B)
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */ 3 /* This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this 5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 #ifndef nsMathMLOperators_h___ 8 #define nsMathMLOperators_h___ 9 10 #include <stdint.h> 11 12 #include "nsStringFwd.h" 13 14 enum nsStretchDirection { 15 NS_STRETCH_DIRECTION_UNSUPPORTED = -1, 16 NS_STRETCH_DIRECTION_DEFAULT = 0, 17 NS_STRETCH_DIRECTION_HORIZONTAL = 1, 18 NS_STRETCH_DIRECTION_VERTICAL = 2 19 }; 20 21 typedef uint32_t nsOperatorFlags; 22 enum nsOperatorFlagEnum : nsOperatorFlags { 23 // define the bits used to handle the operator 24 NS_MATHML_OPERATOR_FORCE_MATHML_CHAR = 1u << 31, 25 NS_MATHML_OPERATOR_MUTABLE = 1 << 30, 26 NS_MATHML_OPERATOR_EMBELLISH_ANCESTOR = 1 << 29, 27 NS_MATHML_OPERATOR_EMBELLISH_ISOLATED = 1 << 28, 28 NS_MATHML_OPERATOR_INVISIBLE = 1 << 26, 29 30 // define the bits used in the Operator Dictionary 31 32 // the very last two bits tell us the form 33 NS_MATHML_OPERATOR_FORM = 0x3, 34 NS_MATHML_OPERATOR_FORM_INFIX = 1, 35 NS_MATHML_OPERATOR_FORM_PREFIX = 2, 36 NS_MATHML_OPERATOR_FORM_POSTFIX = 3, 37 38 // the next 2 bits tell us the direction 39 NS_MATHML_OPERATOR_DIRECTION = 0x3 << 2, 40 NS_MATHML_OPERATOR_DIRECTION_HORIZONTAL = 1 << 2, 41 NS_MATHML_OPERATOR_DIRECTION_VERTICAL = 2 << 2, 42 43 // other bits used in the Operator Dictionary 44 NS_MATHML_OPERATOR_STRETCHY = 1 << 4, 45 NS_MATHML_OPERATOR_FENCE = 1 << 5, 46 NS_MATHML_OPERATOR_ACCENT = 1 << 6, 47 NS_MATHML_OPERATOR_LARGEOP = 1 << 7, 48 NS_MATHML_OPERATOR_SEPARATOR = 1 << 8, 49 NS_MATHML_OPERATOR_MOVABLELIMITS = 1 << 9, 50 NS_MATHML_OPERATOR_SYMMETRIC = 1 << 10, 51 52 // Additional bits not stored in the dictionary 53 NS_MATHML_OPERATOR_MINSIZE_ABSOLUTE = 1 << 11, 54 NS_MATHML_OPERATOR_MAXSIZE_ABSOLUTE = 1 << 12, 55 NS_MATHML_OPERATOR_LSPACE_ATTR = 1 << 13, 56 NS_MATHML_OPERATOR_RSPACE_ATTR = 1 << 14 57 }; 58 59 #define NS_MATHML_OPERATOR_SIZE_INFINITY (mozilla::PositiveInfinity<float>()) 60 61 class nsMathMLOperators { 62 public: 63 static void AddRefTable(void); 64 static void ReleaseTable(void); 65 static void CleanUp(); 66 67 // LookupOperator: 68 // Given the string value of an operator and its form (last two bits of 69 // flags), this method returns attributes of the operator in the output 70 // parameters. The return value indicates whether an entry was found. 71 static bool LookupOperator(const nsString& aOperator, const uint8_t aForm, 72 nsOperatorFlags* aFlags, float* aLeadingSpace, 73 float* aTrailingSpace); 74 75 // LookupOperatorWithFallback: 76 // Same as LookupOperator but if the operator is not found under the supplied 77 // form, then the other forms are tried in the following order: infix, postfix 78 // prefix. The caller can test the output parameter aFlags to know exactly 79 // under which form the operator was found in the Operator Dictionary. 80 static bool LookupOperatorWithFallback(const nsString& aOperator, 81 const uint8_t aForm, 82 nsOperatorFlags* aFlags, 83 float* aLeadingSpace, 84 float* aTrailingSpace); 85 86 // Helper functions used by the nsMathMLChar class. 87 static bool IsMirrorableOperator(const nsString& aOperator); 88 static nsString GetMirroredOperator(const nsString& aOperator); 89 90 // Helper functions used by the nsMathMLChar class to determine whether 91 // aOperator corresponds to an integral operator. 92 static bool IsIntegralOperator(const nsString& aOperator); 93 94 // Helper function used by the nsMathMLChar class. 95 static nsStretchDirection GetStretchyDirection(const nsString& aOperator); 96 }; 97 98 //////////////////////////////////////////////////////////////////////////// 99 // Macros that retrieve the bits used to handle operators 100 101 #define NS_MATHML_OPERATOR_FORCES_MATHML_CHAR(_flags) \ 102 (NS_MATHML_OPERATOR_FORCE_MATHML_CHAR == \ 103 ((_flags) & NS_MATHML_OPERATOR_FORCE_MATHML_CHAR)) 104 105 #define NS_MATHML_OPERATOR_IS_MUTABLE(_flags) \ 106 (NS_MATHML_OPERATOR_MUTABLE == ((_flags) & NS_MATHML_OPERATOR_MUTABLE)) 107 108 #define NS_MATHML_OPERATOR_HAS_EMBELLISH_ANCESTOR(_flags) \ 109 (NS_MATHML_OPERATOR_EMBELLISH_ANCESTOR == \ 110 ((_flags) & NS_MATHML_OPERATOR_EMBELLISH_ANCESTOR)) 111 112 #define NS_MATHML_OPERATOR_EMBELLISH_IS_ISOLATED(_flags) \ 113 (NS_MATHML_OPERATOR_EMBELLISH_ISOLATED == \ 114 ((_flags) & NS_MATHML_OPERATOR_EMBELLISH_ISOLATED)) 115 116 #define NS_MATHML_OPERATOR_IS_INVISIBLE(_flags) \ 117 (NS_MATHML_OPERATOR_INVISIBLE == ((_flags) & NS_MATHML_OPERATOR_INVISIBLE)) 118 119 #define NS_MATHML_OPERATOR_GET_FORM(_flags) ((_flags) & NS_MATHML_OPERATOR_FORM) 120 121 #define NS_MATHML_OPERATOR_GET_DIRECTION(_flags) \ 122 ((_flags) & NS_MATHML_OPERATOR_DIRECTION) 123 124 #define NS_MATHML_OPERATOR_FORM_IS_INFIX(_flags) \ 125 (NS_MATHML_OPERATOR_FORM_INFIX == ((_flags) & NS_MATHML_OPERATOR_FORM)) 126 127 #define NS_MATHML_OPERATOR_FORM_IS_PREFIX(_flags) \ 128 (NS_MATHML_OPERATOR_FORM_PREFIX == ((_flags) & NS_MATHML_OPERATOR_FORM)) 129 130 #define NS_MATHML_OPERATOR_FORM_IS_POSTFIX(_flags) \ 131 (NS_MATHML_OPERATOR_FORM_POSTFIX == ((_flags) & NS_MATHML_OPERATOR_FORM)) 132 133 #define NS_MATHML_OPERATOR_IS_DIRECTION_VERTICAL(_flags) \ 134 (NS_MATHML_OPERATOR_DIRECTION_VERTICAL == \ 135 ((_flags) & NS_MATHML_OPERATOR_DIRECTION)) 136 137 #define NS_MATHML_OPERATOR_IS_DIRECTION_HORIZONTAL(_flags) \ 138 (NS_MATHML_OPERATOR_DIRECTION_HORIZONTAL == \ 139 ((_flags) & NS_MATHML_OPERATOR_DIRECTION)) 140 141 #define NS_MATHML_OPERATOR_IS_STRETCHY(_flags) \ 142 (NS_MATHML_OPERATOR_STRETCHY == ((_flags) & NS_MATHML_OPERATOR_STRETCHY)) 143 144 #define NS_MATHML_OPERATOR_IS_FENCE(_flags) \ 145 (NS_MATHML_OPERATOR_FENCE == ((_flags) & NS_MATHML_OPERATOR_FENCE)) 146 147 #define NS_MATHML_OPERATOR_IS_ACCENT(_flags) \ 148 (NS_MATHML_OPERATOR_ACCENT == ((_flags) & NS_MATHML_OPERATOR_ACCENT)) 149 150 #define NS_MATHML_OPERATOR_IS_LARGEOP(_flags) \ 151 (NS_MATHML_OPERATOR_LARGEOP == ((_flags) & NS_MATHML_OPERATOR_LARGEOP)) 152 153 #define NS_MATHML_OPERATOR_IS_SEPARATOR(_flags) \ 154 (NS_MATHML_OPERATOR_SEPARATOR == ((_flags) & NS_MATHML_OPERATOR_SEPARATOR)) 155 156 #define NS_MATHML_OPERATOR_IS_MOVABLELIMITS(_flags) \ 157 (NS_MATHML_OPERATOR_MOVABLELIMITS == \ 158 ((_flags) & NS_MATHML_OPERATOR_MOVABLELIMITS)) 159 160 #define NS_MATHML_OPERATOR_IS_SYMMETRIC(_flags) \ 161 (NS_MATHML_OPERATOR_SYMMETRIC == ((_flags) & NS_MATHML_OPERATOR_SYMMETRIC)) 162 163 #define NS_MATHML_OPERATOR_MINSIZE_IS_ABSOLUTE(_flags) \ 164 (NS_MATHML_OPERATOR_MINSIZE_ABSOLUTE == \ 165 ((_flags) & NS_MATHML_OPERATOR_MINSIZE_ABSOLUTE)) 166 167 #define NS_MATHML_OPERATOR_MAXSIZE_IS_ABSOLUTE(_flags) \ 168 (NS_MATHML_OPERATOR_MAXSIZE_ABSOLUTE == \ 169 ((_flags) & NS_MATHML_OPERATOR_MAXSIZE_ABSOLUTE)) 170 171 #define NS_MATHML_OPERATOR_HAS_LSPACE_ATTR(_flags) \ 172 (NS_MATHML_OPERATOR_LSPACE_ATTR == \ 173 ((_flags) & NS_MATHML_OPERATOR_LSPACE_ATTR)) 174 175 #define NS_MATHML_OPERATOR_HAS_RSPACE_ATTR(_flags) \ 176 (NS_MATHML_OPERATOR_RSPACE_ATTR == \ 177 ((_flags) & NS_MATHML_OPERATOR_RSPACE_ATTR)) 178 179 #endif /* nsMathMLOperators_h___ */