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

import("//third_party/abseil-cpp/absl.gni")

absl_source_set("traits") {
  public = [ "traits.h" ]
  deps = [
    "//third_party/abseil-cpp/absl/base:config",
    "//third_party/abseil-cpp/absl/numeric:bits",
    "//third_party/abseil-cpp/absl/numeric:int128",
  ]
  visibility = [ "//third_party/abseil-cpp/absl/random/*" ]
}

absl_source_set("distribution_caller") {
  public = [ "distribution_caller.h" ]
  deps = [
    "//third_party/abseil-cpp/absl/base:config",
    "//third_party/abseil-cpp/absl/base:fast_type_id",
    "//third_party/abseil-cpp/absl/meta:type_traits",
    "//third_party/abseil-cpp/absl/utility",
  ]
  visibility = [ "//third_party/abseil-cpp/absl/random/*" ]
}

absl_source_set("fast_uniform_bits") {
  public = [ "fast_uniform_bits.h" ]
  deps = [
    ":traits",
    "//third_party/abseil-cpp/absl/base:config",
    "//third_party/abseil-cpp/absl/meta:type_traits",
  ]
  visibility = [ "//third_party/abseil-cpp/absl/random/*" ]
}

absl_source_set("seed_material") {
  public = [ "seed_material.h" ]
  sources = [ "seed_material.cc" ]
  if (is_win) {
    # TODO(mbonadei): In the bazel file this is -DEFAULTLIB:bcrypt.lib.
    libs = [ "bcrypt.lib" ]
  }
  deps = [
    ":fast_uniform_bits",
    "//third_party/abseil-cpp/absl/base:core_headers",
    "//third_party/abseil-cpp/absl/base:dynamic_annotations",
    "//third_party/abseil-cpp/absl/base:raw_logging_internal",
    "//third_party/abseil-cpp/absl/strings",
    "//third_party/abseil-cpp/absl/strings:string_view",
    "//third_party/abseil-cpp/absl/types:optional",
    "//third_party/abseil-cpp/absl/types:span",
  ]
  visibility = [ "//third_party/abseil-cpp/absl/random/*" ]
}

absl_source_set("pool_urbg") {
  public = [ "pool_urbg.h" ]
  sources = [ "pool_urbg.cc" ]
  deps = [
    ":randen",
    ":seed_material",
    ":traits",
    "//third_party/abseil-cpp/absl/base",
    "//third_party/abseil-cpp/absl/base:config",
    "//third_party/abseil-cpp/absl/base:core_headers",
    "//third_party/abseil-cpp/absl/base:endian",
    "//third_party/abseil-cpp/absl/base:raw_logging_internal",
    "//third_party/abseil-cpp/absl/random:seed_gen_exception",
    "//third_party/abseil-cpp/absl/types:span",
  ]
  visibility = [ "//third_party/abseil-cpp/absl/random/*" ]
}

absl_source_set("explicit_seed_seq") {
  testonly = true
  public = [ "explicit_seed_seq.h" ]
  deps = [
    "//third_party/abseil-cpp/absl/base:config",
    "//third_party/abseil-cpp/absl/base:endian",
  ]
  visibility = [ "//third_party/abseil-cpp/absl/random/*" ]
}

absl_source_set("sequence_urbg") {
  testonly = true
  public = [ "sequence_urbg.h" ]
  deps = [ "//third_party/abseil-cpp/absl/base:config" ]
  visibility = [ "//third_party/abseil-cpp/absl/random/*" ]
}

absl_source_set("salted_seed_seq") {
  public = [ "salted_seed_seq.h" ]
  deps = [
    ":seed_material",
    "//third_party/abseil-cpp/absl/container:inlined_vector",
    "//third_party/abseil-cpp/absl/meta:type_traits",
    "//third_party/abseil-cpp/absl/types:optional",
    "//third_party/abseil-cpp/absl/types:span",
  ]
  visibility = [ "//third_party/abseil-cpp/absl/random/*" ]
}

absl_source_set("iostream_state_saver") {
  public = [ "iostream_state_saver.h" ]
  deps = [
    "//third_party/abseil-cpp/absl/base:config",
    "//third_party/abseil-cpp/absl/meta:type_traits",
    "//third_party/abseil-cpp/absl/numeric:int128",
  ]
  visibility = [ "//third_party/abseil-cpp/absl/random/*" ]
}

absl_source_set("generate_real") {
  public = [ "generate_real.h" ]
  deps = [
    ":fastmath",
    ":traits",
    "//third_party/abseil-cpp/absl/meta:type_traits",
    "//third_party/abseil-cpp/absl/numeric:bits",
  ]
  visibility = [ "//third_party/abseil-cpp/absl/random/*" ]
}

absl_source_set("fastmath") {
  public = [ "fastmath.h" ]
  deps = [ "//third_party/abseil-cpp/absl/numeric:bits" ]
  visibility = [ "//third_party/abseil-cpp/absl/random/*" ]
}

absl_source_set("wide_multiply") {
  public = [ "wide_multiply.h" ]
  deps = [
    ":traits",
    "//third_party/abseil-cpp/absl/base:config",
    "//third_party/abseil-cpp/absl/numeric:bits",
    "//third_party/abseil-cpp/absl/numeric:int128",
  ]
  visibility = [ "//third_party/abseil-cpp/absl/random/*" ]
}

absl_source_set("nonsecure_base") {
  public = [ "nonsecure_base.h" ]
  deps = [
    ":pool_urbg",
    ":salted_seed_seq",
    ":seed_material",
    "//third_party/abseil-cpp/absl/base:core_headers",
    "//third_party/abseil-cpp/absl/container:inlined_vector",
    "//third_party/abseil-cpp/absl/meta:type_traits",
    "//third_party/abseil-cpp/absl/types:span",
  ]
  visibility = [ "//third_party/abseil-cpp/absl/random/*" ]
}

absl_source_set("pcg_engine") {
  public = [ "pcg_engine.h" ]
  deps = [
    ":fastmath",
    ":iostream_state_saver",
    "//third_party/abseil-cpp/absl/base:config",
    "//third_party/abseil-cpp/absl/meta:type_traits",
    "//third_party/abseil-cpp/absl/numeric:bits",
    "//third_party/abseil-cpp/absl/numeric:int128",
  ]
  visibility = [ "//third_party/abseil-cpp/absl/random/*" ]
}

absl_source_set("randen_engine") {
  public = [ "randen_engine.h" ]
  deps = [
    ":iostream_state_saver",
    ":randen",
    "//third_party/abseil-cpp/absl/base:endian",
    "//third_party/abseil-cpp/absl/meta:type_traits",
  ]
  visibility = [ "//third_party/abseil-cpp/absl/random/*" ]
}

absl_source_set("platform") {
  public = [
    "platform.h",
    "randen_traits.h",
  ]
  sources = [ "randen_round_keys.cc" ]
  deps = [
    "//build:chromeos_buildflags",
    "//third_party/abseil-cpp/absl/base:config",
  ]
  visibility = [ "//third_party/abseil-cpp/absl/random/*" ]
}

absl_source_set("randen") {
  public = [ "randen.h" ]
  sources = [ "randen.cc" ]
  deps = [
    ":platform",
    ":randen_hwaes",
    ":randen_slow",
    "//third_party/abseil-cpp/absl/base:raw_logging_internal",
  ]
  visibility = [ "//third_party/abseil-cpp/absl/random/*" ]
}

absl_source_set("randen_slow") {
  public = [ "randen_slow.h" ]
  sources = [ "randen_slow.cc" ]
  deps = [
    ":platform",
    "//third_party/abseil-cpp/absl/base:config",
    "//third_party/abseil-cpp/absl/base:core_headers",
    "//third_party/abseil-cpp/absl/base:endian",
    "//third_party/abseil-cpp/absl/numeric:int128",
  ]
  visibility = [ "//third_party/abseil-cpp/absl/random/*" ]
}

absl_source_set("randen_hwaes") {
  public = [
    "randen_detect.h",
    "randen_hwaes.h",
  ]
  sources = [ "randen_detect.cc" ]
  deps = [
    ":platform",
    ":randen_hwaes_impl",
    "//third_party/abseil-cpp/absl/base:config",
    "//third_party/abseil-cpp/absl/types:optional",
  ]
  visibility = [ "//third_party/abseil-cpp/absl/random/*" ]
}

absl_source_set("randen_hwaes_impl") {
  sources = [
    "randen_hwaes.cc",
    "randen_hwaes.h",
  ]
  deps = [
    ":platform",
    "//third_party/abseil-cpp/absl/base:config",
    "//third_party/abseil-cpp/absl/base:core_headers",
    "//third_party/abseil-cpp/absl/numeric:int128",
  ]
  visibility = [ "//third_party/abseil-cpp/absl/random/*" ]
}

executable("gaussian_distribution_gentables") {
  sources = [ "gaussian_distribution_gentables.cc" ]
  deps = [
    "//third_party/abseil-cpp/absl/base:core_headers",
    "//third_party/abseil-cpp/absl/random:distributions",
  ]
  visibility = [ "//third_party/abseil-cpp/absl/random/*" ]
}

absl_source_set("distribution_test_util") {
  testonly = true
  public = [
    "chi_square.h",
    "distribution_test_util.h",
  ]
  sources = [
    "chi_square.cc",
    "distribution_test_util.cc",
  ]
  deps = [
    "//third_party/abseil-cpp/absl/base:config",
    "//third_party/abseil-cpp/absl/base:core_headers",
    "//third_party/abseil-cpp/absl/base:raw_logging_internal",
    "//third_party/abseil-cpp/absl/strings",
    "//third_party/abseil-cpp/absl/strings:str_format",
    "//third_party/abseil-cpp/absl/strings:string_view",
    "//third_party/abseil-cpp/absl/types:span",
  ]
  visibility = [ "//third_party/abseil-cpp/absl/random/*" ]
}

absl_source_set("mock_helpers") {
  public = [ "mock_helpers.h" ]
  deps = [
    "//third_party/abseil-cpp/absl/base:config",
    "//third_party/abseil-cpp/absl/base:fast_type_id",
    "//third_party/abseil-cpp/absl/types:optional",
  ]
}

absl_source_set("mock_overload_set") {
  testonly = true
  public = [ "mock_overload_set.h" ]
  deps = [
    ":mock_helpers",
    "//third_party/abseil-cpp/absl/base:config",
    "//third_party/abseil-cpp/absl/random:mocking_bit_gen",
    "//third_party/googletest:gtest",
  ]
}

absl_test("nonsecure_base_test") {
  sources = [ "nonsecure_base_test.cc" ]
  deps = [
    ":nonsecure_base",
    "//third_party/abseil-cpp/absl/meta:type_traits",
    "//third_party/abseil-cpp/absl/random",
    "//third_party/abseil-cpp/absl/random:distributions",
  ]
}

# TODO(danilchap): Enable when can be compiled on all chromium bots.
# nanobenchmark uses platform specific functions to take accurate current time,
# and fallbacks to clock_gettime. Several chromium configurations lack both
# dedicated code and the clock_gettime system function.
# absl_source_set("nanobenchmark") {
#  sources = [ "nanobenchmark.cc" ]
#  deps = [
#    ":platform",
#    ":randen_engine",
#    "//third_party/abseil-cpp/absl/base:config",
#    "//third_party/abseil-cpp/absl/base:core_headers",
#    "//third_party/abseil-cpp/absl/base:raw_logging_internal",
#  ]
# }

absl_source_set("uniform_helper") {
  public = [ "uniform_helper.h" ]
  deps = [
    ":traits",
    "//third_party/abseil-cpp/absl/base:config",
    "//third_party/abseil-cpp/absl/meta:type_traits",
    "//third_party/abseil-cpp/absl/numeric:int128",
  ]
  visibility = [ "//third_party/abseil-cpp/absl/random/*" ]
}

absl_source_set("mock_validators") {
  public = [ "mock_validators.h" ]
  deps = [
    ":iostream_state_saver",
    ":uniform_helper",
    "//third_party/abseil-cpp/absl/base:config",
    "//third_party/abseil-cpp/absl/base:raw_logging_internal",
    "//third_party/abseil-cpp/absl/strings",
    "//third_party/abseil-cpp/absl/strings:string_view",
  ]
}
