dom/smil/nsSMILTargetIdentifier.h
author Mike Hommey <mh+mozilla@glandium.org>
Fri, 02 Jun 2017 15:07:58 +0900
changeset 410640 f360dd9d411e7ba61531bed2c32a0981cc6c418a
parent 397175 00c615691a6b2d1cb9683a8017b656af41198796
child 435808 67a8e12324569dd730347187e2ffccae486c758b
permissions -rw-r--r--
Bug 1369622 - Restore static asserts for lack of arguments on some macros. r=froydnj Bug 1368932 removed MOZ_STATIC_ASSERT_VALID_ARG_COUNT because it didn't actually work for large numbers of arguments. But it was kind of useful for macros that expand to something broken when they are given no variadic argument at all. Now that we have a macro that doesn't require tricks to count empty arguments lists, however, we can use straightforward static_asserts instead of a generic macro, which has the side effect of providing more context in the error message.

/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* 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 NS_SMILTARGETIDENTIFIER_H_
#define NS_SMILTARGETIDENTIFIER_H_

#include "mozilla/dom/Element.h"

/**
 * Struct: nsSMILTargetIdentifier
 *
 * Tuple of: { Animated Element, Attribute Name }
 *
 * Used in nsSMILAnimationController as hash key for mapping an animation
 * target to the nsSMILCompositor for that target.
 *
 * NOTE: Need a nsRefPtr for the element & attribute name, because
 * nsSMILAnimationController retain its hash table for one sample into the
 * future, and we need to make sure their target isn't deleted in that time.
 */

struct nsSMILTargetIdentifier
{
  nsSMILTargetIdentifier()
    : mElement(nullptr), mAttributeName(nullptr),
      mAttributeNamespaceID(kNameSpaceID_Unknown) {}

  inline bool Equals(const nsSMILTargetIdentifier& aOther) const
  {
    return (aOther.mElement              == mElement &&
            aOther.mAttributeName        == mAttributeName &&
            aOther.mAttributeNamespaceID == mAttributeNamespaceID);
  }

  RefPtr<mozilla::dom::Element> mElement;
  RefPtr<nsIAtom>               mAttributeName;
  int32_t                       mAttributeNamespaceID;
};

/**
 * Class: nsSMILWeakTargetIdentifier
 *
 * Version of the above struct that uses non-owning pointers.  These are kept
 * private, to ensure that they aren't ever dereferenced (or used at all,
 * outside of Equals()).
 *
 * This is solely for comparisons to determine if a target has changed
 * from one sample to the next.
 */
class nsSMILWeakTargetIdentifier
{
public:
  // Trivial constructor
  nsSMILWeakTargetIdentifier()
    : mElement(nullptr), mAttributeName(nullptr) {}

  // Allow us to update a weak identifier to match a given non-weak identifier
  nsSMILWeakTargetIdentifier&
    operator=(const nsSMILTargetIdentifier& aOther)
  {
    mElement = aOther.mElement;
    mAttributeName = aOther.mAttributeName;
    return *this;
  }

  // Allow for comparison vs. non-weak identifier
  inline bool Equals(const nsSMILTargetIdentifier& aOther) const
  {
    return (aOther.mElement       == mElement &&
            aOther.mAttributeName == mAttributeName);
  }

private:
  const nsIContent* mElement;
  const nsIAtom*    mAttributeName;
};

#endif // NS_SMILTARGETIDENTIFIER_H_