//===--- DictTest2.swift --------------------------------------------------===//
//
// 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
//
//===----------------------------------------------------------------------===//

import TestsUtils

@inline(never)
public func run_Dictionary2(_ N: Int) {
  let size = 500
  let ref_result = 199
  var res = 0
  for _ in 1...5*N {
    var x: [String: Int] = [:]
    for i in 1...size {
      x[String(i, radix:16)] = i
    }

    res = 0
    for i in 0..<size {
      let i2 = size-i
      if x[String(i2)] != nil {
        res += 1
      }
    }
    if res != ref_result {
      break
    }
  }
  CheckResults(res == ref_result, "Incorrect results in Dictionary2: \(res) != \(ref_result)")
}

class Box<T : Hashable> : Hashable where T : Equatable {
  var value: T

  init(_ v: T) {
    value = v
  }

  var hashValue: Int {
    return value.hashValue
  }

  static func ==<T: Equatable>(lhs: Box<T>, rhs: Box<T>) -> Bool {
    return lhs.value == rhs.value
  }
}

@inline(never)
public func run_Dictionary2OfObjects(_ N: Int) {
  let size = 500
  let ref_result = 199
  var res = 0
  for _ in 1...5*N {
    var x: [Box<String>:Box<Int>] = [:]
    for i in 1...size {
      x[Box(String(i, radix:16))] = Box(i)
    }

    res = 0
    for i in 0..<size {
      let i2 = size-i
      if x[Box(String(i2))] != nil {
        res += 1
      }
    }
    if res != ref_result {
      break
    }
  }
  CheckResults(res == ref_result, "Incorrect results in Dictionary2AllObjects: \(res) != \(ref_result)")
}
