Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1653)

Unified Diff: Source/core/platform/animation/TimingFunctionTestHelper.cpp

Issue 60323005: Adding operator== to TimingFunctionTestHelper. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Rebase + Fixing "control reaches end of non-void function". Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: Source/core/platform/animation/TimingFunctionTestHelper.cpp
diff --git a/Source/core/platform/animation/TimingFunctionTestHelper.cpp b/Source/core/platform/animation/TimingFunctionTestHelper.cpp
index 87825e4ee7f934c8cf336cf42da579063e9e9f3a..17a7be6e0b1211871147772d955bf0002fe7636b 100644
--- a/Source/core/platform/animation/TimingFunctionTestHelper.cpp
+++ b/Source/core/platform/animation/TimingFunctionTestHelper.cpp
@@ -35,6 +35,65 @@
namespace WebCore {
+// This class exists so that ChainedTimingFunction only needs to friend one thing.
+class ChainedTimingFunctionTestHelper {
+ static void PrintTo(const ChainedTimingFunction& timingFunction, ::std::ostream* os)
+ {
+ // Forward declare the generic PrintTo function as ChainedTimingFunction needs to call it.
+ void PrintTo(const TimingFunction&, ::std::ostream*);
+
+ *os << "ChainedTimingFunction@" << &timingFunction << "(";
+ for (size_t i = 0; i < timingFunction.m_segments.size(); i++) {
+ ChainedTimingFunction::Segment segment = timingFunction.m_segments[i];
+ PrintTo(*(segment.m_timingFunction.get()), os);
+ *os << "[" << segment.m_min << " -> " << segment.m_max << "]";
+ if (i+1 != timingFunction.m_segments.size()) {
+ *os << ", ";
+ }
+ }
+ *os << ")";
+ }
+
+ static bool equals(const ChainedTimingFunction& lhs, const TimingFunction& rhs)
+ {
+ if (rhs.type() != TimingFunction::ChainedFunction)
+ return false;
+
+ if (&lhs == &rhs)
+ return true;
+
+ const ChainedTimingFunction* ctf = static_cast<const ChainedTimingFunction*>(&rhs);
+ if (lhs.m_segments.size() != ctf->m_segments.size())
+ return false;
+
+ for (size_t i = 0; i < lhs.m_segments.size(); i++) {
+ if (!equals(lhs.m_segments[i], ctf->m_segments[i]))
+ return false;
+ }
+ return true;
+ }
+
+ static bool equals(const ChainedTimingFunction::Segment& lhs, const ChainedTimingFunction::Segment& rhs)
+ {
+ if (&lhs == &rhs)
+ return true;
+
+ if ((lhs.m_min != rhs.m_min) || (lhs.m_max != rhs.m_max))
+ return false;
+
+ if (lhs.m_timingFunction == rhs.m_timingFunction)
+ return true;
+
+ ASSERT(lhs.m_timingFunction);
+ ASSERT(rhs.m_timingFunction);
+
+ return (*(lhs.m_timingFunction.get())) == (*(rhs.m_timingFunction.get()));
+ }
+
+ friend void PrintTo(const ChainedTimingFunction&, ::std::ostream*);
+ friend bool operator==(const ChainedTimingFunction& lhs, const TimingFunction& rhs);
+};
+
void PrintTo(const LinearTimingFunction& timingFunction, ::std::ostream* os)
{
*os << "LinearTimingFunction@" << &timingFunction;
@@ -90,31 +149,9 @@ void PrintTo(const StepsTimingFunction& timingFunction, ::std::ostream* os)
*os << ")";
}
-class ChainedTimingFunctionPrinter {
-private:
- static void PrintTo(const ChainedTimingFunction& timingFunction, ::std::ostream* os)
- {
- // Forward declare the generic PrintTo function as ChainedTimingFunction needs to call it.
- void PrintTo(const TimingFunction&, ::std::ostream*);
-
- *os << "ChainedTimingFunction@" << &timingFunction << "(";
- for (size_t i = 0; i < timingFunction.m_segments.size(); i++) {
- ChainedTimingFunction::Segment segment = timingFunction.m_segments[i];
- PrintTo(*(segment.m_timingFunction.get()), os);
- *os << "[" << segment.m_min << " -> " << segment.m_max << "]";
- if (i+1 != timingFunction.m_segments.size()) {
- *os << ", ";
- }
- }
- *os << ")";
- }
-
- friend void PrintTo(const ChainedTimingFunction&, ::std::ostream*);
-};
-
void PrintTo(const ChainedTimingFunction& timingFunction, ::std::ostream* os)
{
- ChainedTimingFunctionPrinter::PrintTo(timingFunction, os);
+ ChainedTimingFunctionTestHelper::PrintTo(timingFunction, os);
}
// The generic PrintTo *must* come after the non-generic PrintTo otherwise it
@@ -147,4 +184,71 @@ void PrintTo(const TimingFunction& timingFunction, ::std::ostream* os)
}
}
+bool operator==(const LinearTimingFunction& lhs, const TimingFunction& rhs)
+{
+ return rhs.type() == TimingFunction::LinearFunction;
+}
+
+bool operator==(const CubicBezierTimingFunction& lhs, const TimingFunction& rhs)
+{
+ if (rhs.type() != TimingFunction::CubicBezierFunction)
+ return false;
+
+ const CubicBezierTimingFunction* ctf = static_cast<const CubicBezierTimingFunction*>(&rhs);
+ if ((lhs.subType() == CubicBezierTimingFunction::Custom) && (ctf->subType() == CubicBezierTimingFunction::Custom))
+ return (lhs.x1() == ctf->x1()) && (lhs.y1() == ctf->y1()) && (lhs.x2() == ctf->x2()) && (lhs.y2() == ctf->y2());
+
+ return lhs.subType() == ctf->subType();
+}
+
+bool operator==(const StepsTimingFunction& lhs, const TimingFunction& rhs)
+{
+ if (rhs.type() != TimingFunction::StepsFunction)
+ return false;
+
+ const StepsTimingFunction* stf = static_cast<const StepsTimingFunction*>(&rhs);
+ if ((lhs.subType() == StepsTimingFunction::Custom) && (stf->subType() == StepsTimingFunction::Custom))
+ return (lhs.numberOfSteps() == stf->numberOfSteps()) && (lhs.stepAtStart() == stf->stepAtStart());
+
+ return lhs.subType() == stf->subType();
+}
+
+bool operator==(const ChainedTimingFunction& lhs, const TimingFunction& rhs)
+{
+ return ChainedTimingFunctionTestHelper::equals(lhs, rhs);
+}
+
+// Like in the PrintTo case, the generic operator== *must* come after the
+// non-generic operator== otherwise it will end up calling itself.
+bool operator==(const TimingFunction& lhs, const TimingFunction& rhs)
+{
+ switch (lhs.type()) {
+ case TimingFunction::LinearFunction: {
+ const LinearTimingFunction* linear = static_cast<const LinearTimingFunction*>(&lhs);
+ return (*linear == rhs);
+ }
+ case TimingFunction::CubicBezierFunction: {
+ const CubicBezierTimingFunction* cubic = static_cast<const CubicBezierTimingFunction*>(&lhs);
+ return (*cubic == rhs);
+ }
+ case TimingFunction::StepsFunction: {
+ const StepsTimingFunction* step = static_cast<const StepsTimingFunction*>(&lhs);
+ return (*step == rhs);
+ }
+ case TimingFunction::ChainedFunction: {
+ const ChainedTimingFunction* chained = static_cast<const ChainedTimingFunction*>(&lhs);
+ return (*chained == rhs);
+ }
+ default:
+ ASSERT_NOT_REACHED();
+ }
+ return false;
+}
+
+// No need to define specific operator!= as they can all come via this function.
+bool operator!=(const TimingFunction& lhs, const TimingFunction& rhs)
+{
+ return !(lhs == rhs);
+}
+
} // namespace WebCore

Powered by Google App Engine
This is Rietveld 408576698