// Copyright 2021 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CC_DOCUMENT_TRANSITION_DOCUMENT_TRANSITION_SHARED_ELEMENT_ID_H_
#define CC_DOCUMENT_TRANSITION_DOCUMENT_TRANSITION_SHARED_ELEMENT_ID_H_

#include <stdint.h>

#include <string>
#include <tuple>

#include "base/containers/flat_set.h"
#include "cc/cc_export.h"

namespace cc {

class CC_EXPORT DocumentTransitionSharedElementId {
 public:
  DocumentTransitionSharedElementId();
  explicit DocumentTransitionSharedElementId(uint32_t document_tag);
  DocumentTransitionSharedElementId(const DocumentTransitionSharedElementId&);
  DocumentTransitionSharedElementId(DocumentTransitionSharedElementId&&);
  ~DocumentTransitionSharedElementId();

  // Add a shared index to this id. It must have a valid document tag.
  void AddIndex(uint32_t index);

  // Returns true if the document tag matches this id and the index is in the
  // list of indices for this id.
  bool Matches(uint32_t document_tag, uint32_t index) const;

  DocumentTransitionSharedElementId& operator=(
      DocumentTransitionSharedElementId&&) = default;

  DocumentTransitionSharedElementId& operator=(
      const DocumentTransitionSharedElementId&) = default;

  bool operator==(const DocumentTransitionSharedElementId& other) const {
    return element_indices_ == other.element_indices_ &&
           document_tag_ == other.document_tag_;
  }

  bool operator!=(const DocumentTransitionSharedElementId& other) const {
    return !(*this == other);
  }

  bool operator<(const DocumentTransitionSharedElementId& other) const {
    return std::tie(document_tag_, element_indices_) <
           std::tie(other.document_tag_, other.element_indices_);
  }

  bool valid() const {
    return document_tag_ != 0u && !element_indices_.empty();
  }

  std::string ToString() const;

 private:
  uint32_t document_tag_ = 0u;
  base::flat_set<uint32_t> element_indices_;
};

}  // namespace cc

#endif  // CC_DOCUMENT_TRANSITION_DOCUMENT_TRANSITION_SHARED_ELEMENT_ID_H_
