replaced by .editorconfig Differential Revision: https://phabricator.services.mozilla.com/D287852
128 lines
3.9 KiB
C++
128 lines
3.9 KiB
C++
/* 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_ */
|