Source code

Revision control

Copy as Markdown

Other Tools

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef nsMathMLOperators_h_
#define nsMathMLOperators_h_
#include <stdint.h>
#include "mozilla/EnumSet.h"
#include "mozilla/FloatingPoint.h"
#include "nsStringFwd.h"
enum class StretchDirection : uint8_t {
Unsupported,
Default,
Horizontal,
Vertical,
};
enum class OperatorBoolean : uint16_t {
ForcesMathMLChar,
Mutable,
HasEmbellishAncestor,
EmbellishIsIsolated,
Invisible,
Stretchy,
Fence,
Accent,
LargeOperator,
Separator,
MovableLimits,
Symmetric,
MinSizeIsAbsolute,
MaxSizeIsAbsolute,
HasLSpaceAttribute,
HasRSpaceAttribute,
};
using OperatorBooleans = mozilla::EnumSet<OperatorBoolean>;
enum class OperatorForm : uint8_t {
Unknown,
Infix,
Prefix,
Postfix,
};
constexpr uint8_t OperatorFormMask = 0x3;
enum class OperatorDirection : uint8_t {
Unknown,
Horizontal,
Vertical,
};
constexpr uint8_t OperatorDirectionShift = 2;
constexpr uint8_t OperatorDirectionMask = 0x3 << OperatorDirectionShift;
class nsOperatorFlags {
public:
OperatorBooleans& Booleans() { return mBooleans; }
const OperatorBooleans& Booleans() const { return mBooleans; }
OperatorForm Form() const {
return static_cast<OperatorForm>(mFormAndDirection & OperatorFormMask);
}
OperatorDirection Direction() const {
return static_cast<OperatorDirection>(
(mFormAndDirection & OperatorDirectionMask) >> OperatorDirectionShift);
}
void SetForm(OperatorForm aForm) {
mFormAndDirection &= ~OperatorFormMask;
mFormAndDirection |= static_cast<uint8_t>(aForm);
}
void SetDirection(OperatorDirection aDirection) {
mFormAndDirection &= ~OperatorDirectionMask;
mFormAndDirection |= static_cast<uint8_t>(aDirection)
<< OperatorDirectionShift;
}
void Clear() {
mBooleans.clear();
mFormAndDirection = 0;
}
private:
OperatorBooleans mBooleans;
uint8_t mFormAndDirection = 0;
};
constexpr inline float kMathMLOperatorSizeInfinity =
mozilla::PositiveInfinity<float>();
class nsMathMLOperators {
public:
static void AddRefTable(void);
static void ReleaseTable(void);
static void CleanUp();
// LookupOperator:
// Given the string value of an operator and its form (last two bits of
// flags), this method returns attributes of the operator in the output
// parameters. The return value indicates whether an entry was found.
static bool LookupOperator(const nsString& aOperator,
const OperatorForm aForm, nsOperatorFlags* aFlags,
float* aLeadingSpace, float* aTrailingSpace);
// LookupOperatorWithFallback:
// Same as LookupOperator but if the operator is not found under the supplied
// form, then the other forms are tried in the following order: infix, postfix
// prefix. The caller can test the output parameter aFlags to know exactly
// under which form the operator was found in the Operator Dictionary.
static bool LookupOperatorWithFallback(const nsString& aOperator,
const OperatorForm aForm,
nsOperatorFlags* aFlags,
float* aLeadingSpace,
float* aTrailingSpace);
// Helper functions used by the nsMathMLChar class.
static bool IsMirrorableOperator(const nsString& aOperator);
static nsString GetMirroredOperator(const nsString& aOperator);
// Helper functions used by the nsMathMLChar class to determine whether
// aOperator corresponds to an integral operator.
static bool IsIntegralOperator(const nsString& aOperator);
// Helper function used by the nsMathMLChar class.
static StretchDirection GetStretchyDirection(const nsString& aOperator);
};
#endif /* nsMathMLOperators_h_ */