#
# Copyright 2019 The Abseil Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

load(
    "//absl:copts/configure_copts.bzl",
    "ABSL_DEFAULT_COPTS",
    "ABSL_DEFAULT_LINKOPTS",
    "ABSL_TEST_COPTS",
)

package(default_visibility = ["//visibility:public"])

licenses(["notice"])

cc_library(
    name = "hash",
    srcs = [
        "internal/hash.cc",
        "internal/hash.h",
    ],
    hdrs = ["hash.h"],
    copts = ABSL_DEFAULT_COPTS,
    linkopts = ABSL_DEFAULT_LINKOPTS,
    deps = [
        ":city",
        ":low_level_hash",
        "//absl/base:config",
        "//absl/base:core_headers",
        "//absl/base:endian",
        "//absl/container:fixed_array",
        "//absl/meta:type_traits",
        "//absl/numeric:int128",
        "//absl/strings",
        "//absl/types:optional",
        "//absl/types:variant",
        "//absl/utility",
    ],
)

cc_library(
    name = "hash_testing",
    testonly = 1,
    hdrs = ["hash_testing.h"],
    linkopts = ABSL_DEFAULT_LINKOPTS,
    deps = [
        ":spy_hash_state",
        "//absl/meta:type_traits",
        "//absl/strings",
        "//absl/types:variant",
        "@com_google_googletest//:gtest",
    ],
)

cc_test(
    name = "hash_test",
    srcs = ["hash_test.cc"],
    copts = ABSL_TEST_COPTS,
    linkopts = ABSL_DEFAULT_LINKOPTS,
    deps = [
        ":hash",
        ":hash_testing",
        ":spy_hash_state",
        "//absl/base:core_headers",
        "//absl/container:flat_hash_set",
        "//absl/meta:type_traits",
        "//absl/numeric:int128",
        "//absl/strings:cord_test_helpers",
        "@com_google_googletest//:gtest_main",
    ],
)

cc_binary(
    name = "hash_benchmark",
    testonly = 1,
    srcs = ["hash_benchmark.cc"],
    copts = ABSL_TEST_COPTS,
    linkopts = ABSL_DEFAULT_LINKOPTS,
    tags = ["benchmark"],
    visibility = ["//visibility:private"],
    deps = [
        ":hash",
        "//absl/base:core_headers",
        "//absl/random",
        "//absl/strings",
        "//absl/strings:cord",
        "//absl/strings:cord_test_helpers",
        "@com_github_google_benchmark//:benchmark_main",
    ],
)

cc_library(
    name = "spy_hash_state",
    testonly = 1,
    hdrs = ["internal/spy_hash_state.h"],
    copts = ABSL_DEFAULT_COPTS,
    linkopts = ABSL_DEFAULT_LINKOPTS,
    visibility = ["//visibility:private"],
    deps = [
        ":hash",
        "//absl/strings",
        "//absl/strings:str_format",
    ],
)

cc_library(
    name = "city",
    srcs = ["internal/city.cc"],
    hdrs = [
        "internal/city.h",
    ],
    copts = ABSL_DEFAULT_COPTS,
    linkopts = ABSL_DEFAULT_LINKOPTS,
    deps = [
        "//absl/base:config",
        "//absl/base:core_headers",
        "//absl/base:endian",
    ],
)

cc_test(
    name = "city_test",
    srcs = ["internal/city_test.cc"],
    copts = ABSL_TEST_COPTS,
    linkopts = ABSL_DEFAULT_LINKOPTS,
    deps = [
        ":city",
        "@com_google_googletest//:gtest_main",
    ],
)

cc_library(
    name = "low_level_hash",
    srcs = ["internal/low_level_hash.cc"],
    hdrs = ["internal/low_level_hash.h"],
    copts = ABSL_DEFAULT_COPTS,
    linkopts = ABSL_DEFAULT_LINKOPTS,
    visibility = ["//visibility:private"],
    deps = [
        "//absl/base:config",
        "//absl/base:endian",
        "//absl/numeric:bits",
        "//absl/numeric:int128",
    ],
)

cc_test(
    name = "low_level_hash_test",
    srcs = ["internal/low_level_hash_test.cc"],
    copts = ABSL_TEST_COPTS,
    linkopts = ABSL_DEFAULT_LINKOPTS,
    visibility = ["//visibility:private"],
    deps = [
        ":low_level_hash",
        "//absl/strings",
        "@com_google_googletest//:gtest_main",
    ],
)
