//===----------------------------------------------------------------------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//

// This benchmark tests AnyHashable's initializer that needs to dynamically
// upcast the instance to the type that introduces the Hashable
// conformance.

import TestsUtils

// 23% _swift_dynamicCast
// 23% _swift_release_
// 18% _swift_stdlib_makeAnyHashableUsingDefaultRepresentation
// 11% _swift_stdlib_makeAnyHashableUpcastingToHashableBaseType
// 16% _swift_retain_[n]
//  5% swift_conformsToProtocol
public var AnyHashableWithAClass = BenchmarkInfo(
  name: "AnyHashableWithAClass",
  runFunction: run_AnyHashableWithAClass,
  tags: [.abstraction, .runtime, .cpubench]
)

class TestHashableBase : Hashable {
  var value: Int
  init(_ value: Int) {
    self.value = value
  }

  func hash(into hasher: inout Hasher) {
    hasher.combine(value)
  }

  static func == (
    lhs: TestHashableBase,
    rhs: TestHashableBase
  ) -> Bool {
    return lhs.value == rhs.value
  }
}

class TestHashableDerived1 : TestHashableBase {}
class TestHashableDerived2 : TestHashableDerived1 {}
class TestHashableDerived3 : TestHashableDerived2 {}
class TestHashableDerived4 : TestHashableDerived3 {}
class TestHashableDerived5 : TestHashableDerived4 {}

@inline(never)
public func run_AnyHashableWithAClass(_ N: Int) {
  let c = TestHashableDerived5(10)
  for _ in 0...(N*500000) {
    _ = AnyHashable(c)
  }
}

