This repository was archived by the owner on Jul 9, 2025. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 2.1k
Expand file tree
/
Copy pathnsSMILValue.cpp
More file actions
144 lines (118 loc) · 3.61 KB
/
Copy pathnsSMILValue.cpp
File metadata and controls
144 lines (118 loc) · 3.61 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* 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/. */
#include "nsSMILValue.h"
#include "nsDebug.h"
#include <string.h>
//----------------------------------------------------------------------
// Public methods
nsSMILValue::nsSMILValue(const nsISMILType* aType)
: mType(&nsSMILNullType::sSingleton)
{
if (!aType) {
NS_ERROR("Trying to construct nsSMILValue with null mType pointer");
return;
}
InitAndCheckPostcondition(aType);
}
nsSMILValue::nsSMILValue(const nsSMILValue& aVal)
: mType(&nsSMILNullType::sSingleton)
{
InitAndCheckPostcondition(aVal.mType);
mType->Assign(*this, aVal);
}
const nsSMILValue&
nsSMILValue::operator=(const nsSMILValue& aVal)
{
if (&aVal == this)
return *this;
if (mType != aVal.mType) {
DestroyAndReinit(aVal.mType);
}
mType->Assign(*this, aVal);
return *this;
}
bool
nsSMILValue::operator==(const nsSMILValue& aVal) const
{
if (&aVal == this)
return true;
return mType == aVal.mType && mType->IsEqual(*this, aVal);
}
void
nsSMILValue::Swap(nsSMILValue& aOther)
{
nsSMILValue tmp;
memcpy(&tmp, &aOther, sizeof(nsSMILValue)); // tmp = aOther
memcpy(&aOther, this, sizeof(nsSMILValue)); // aOther = this
memcpy(this, &tmp, sizeof(nsSMILValue)); // this = tmp
// |tmp| is about to die -- we need to clear its mType, so that its
// destructor doesn't muck with the data we just transferred out of it.
tmp.mType = &nsSMILNullType::sSingleton;
}
nsresult
nsSMILValue::Add(const nsSMILValue& aValueToAdd, uint32_t aCount)
{
if (aValueToAdd.mType != mType) {
NS_ERROR("Trying to add incompatible types");
return NS_ERROR_FAILURE;
}
return mType->Add(*this, aValueToAdd, aCount);
}
nsresult
nsSMILValue::SandwichAdd(const nsSMILValue& aValueToAdd)
{
if (aValueToAdd.mType != mType) {
NS_ERROR("Trying to add incompatible types");
return NS_ERROR_FAILURE;
}
return mType->SandwichAdd(*this, aValueToAdd);
}
nsresult
nsSMILValue::ComputeDistance(const nsSMILValue& aTo, double& aDistance) const
{
if (aTo.mType != mType) {
NS_ERROR("Trying to calculate distance between incompatible types");
return NS_ERROR_FAILURE;
}
return mType->ComputeDistance(*this, aTo, aDistance);
}
nsresult
nsSMILValue::Interpolate(const nsSMILValue& aEndVal,
double aUnitDistance,
nsSMILValue& aResult) const
{
if (aEndVal.mType != mType) {
NS_ERROR("Trying to interpolate between incompatible types");
return NS_ERROR_FAILURE;
}
if (aResult.mType != mType) {
// Outparam has wrong type
aResult.DestroyAndReinit(mType);
}
return mType->Interpolate(*this, aEndVal, aUnitDistance, aResult);
}
//----------------------------------------------------------------------
// Helper methods
// Wrappers for nsISMILType::Init & ::Destroy that verify their postconditions
void
nsSMILValue::InitAndCheckPostcondition(const nsISMILType* aNewType)
{
aNewType->Init(*this);
NS_ABORT_IF_FALSE(mType == aNewType,
"Post-condition of Init failed. nsSMILValue is invalid");
}
void
nsSMILValue::DestroyAndCheckPostcondition()
{
mType->Destroy(*this);
NS_ABORT_IF_FALSE(IsNull(), "Post-condition of Destroy failed. "
"nsSMILValue not null after destroying");
}
void
nsSMILValue::DestroyAndReinit(const nsISMILType* aNewType)
{
DestroyAndCheckPostcondition();
InitAndCheckPostcondition(aNewType);
}