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

#import "ios/chrome/browser/tab_switcher/ui_bundled/item_utils.h"

#import "ios/chrome/browser/tab_switcher/ui_bundled/tab_group_item.h"
#import "ios/chrome/browser/tab_switcher/ui_bundled/tab_switcher_item.h"
#import "ios/web/public/web_state_id.h"

extern "C" {

// Hashing the identifier via NSNumber. NSNumber provides a simple hash,
// seemingly based on Knuth's Multiplicative Hash. This gives a more uniform
// repartition of the hash values than using the identifier as the hash
// (identity, done for example by std::hash<int>).
// Using an NSNumber should also be performant, as it is implemented as a tagged
// pointer, eschewing the creation of a full object in memory.
// Resources:
// https://opensource.apple.com/source/CF/CF-550/ForFoundationOnly.h
// https://en.cppreference.com/w/cpp/utility/hash#:~:text=some%20implementations%20use%20trivial%20(identity)%20hash%20functions%20which%20map%20an%20integer%20to%20itself.
// https://www.mikeash.com/pyblog/friday-qa-2012-07-27-lets-build-tagged-pointers.html#:~:text=NSNumber%20uses%20a%20new%20runtime%20facility%20called%20tagged%20pointers%20to%20increase%20speed%20and%20reduce%20memory%20usage
NSUInteger GetHashForTabSwitcherItem(TabSwitcherItem* tab_switcher_item) {
  return @(tab_switcher_item.identifier.identifier()).hash;
}

NSUInteger GetHashForTabGroupItem(TabGroupItem* tab_group_item) {
  return [NSValue valueWithPointer:tab_group_item.tabGroupIdentifier].hash;
}

BOOL CompareTabSwitcherItems(TabSwitcherItem* lhs, TabSwitcherItem* rhs) {
  return lhs.identifier == rhs.identifier;
}

BOOL CompareTabGroupItems(TabGroupItem* lhs, TabGroupItem* rhs) {
  return lhs.tabGroupIdentifier == rhs.tabGroupIdentifier;
}

}  // extern "C"
