# Copyright 2021 The Pigweed 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("@bazel_skylib//lib:selects.bzl", "selects")
load("@rules_cc//cc:cc_library.bzl", "cc_library")
load("@rules_python//sphinxdocs:sphinx_docs_library.bzl", "sphinx_docs_library")
load("//pw_bloat:pw_size_diff.bzl", "pw_size_diff")
load("//pw_bloat:pw_size_table.bzl", "pw_size_table")
load("//pw_build:compatibility.bzl", "boolean_constraint_value", "incompatible_with_mcu")
load("//pw_unit_test:pw_cc_test.bzl", "pw_cc_test")

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

licenses(["notice"])

cc_library(
    name = "config",
    hdrs = ["public/pw_function/config.h"],
    strip_include_prefix = "public",
    tags = ["noclangtidy"],
    deps = [":config_override"],
)

label_flag(
    name = "config_override",
    build_setting_default = "//pw_build:default_module_config",
)

# Constraint to indicate if dynamic allocation is enabled for pw_function.
# This is used to restrict targets that require dynamic allocation (like Sapphire)
# on platforms that don't support it.
boolean_constraint_value(
    name = "dynamic_allocation_enabled",
)

cc_library(
    name = "pw_function",
    hdrs = [
        "public/pw_function/function.h",
        "public/pw_function/function_ref.h",
    ],
    strip_include_prefix = "public",
    deps = [
        ":config",
        "//pw_assert:assert",
        "//pw_preprocessor",
        "//third_party/fuchsia:fit",
    ],
)

pw_cc_test(
    name = "function_test",
    srcs = ["function_test.cc"],
    has_nc_test = True,
    deps = [
        ":pw_function",
        "//pw_polyfill",
    ],
)

pw_cc_test(
    name = "function_ref_test",
    srcs = ["function_ref_test.cc"],
    has_nc_test = True,
    deps = [
        ":pw_function",
    ],
)

cc_library(
    name = "pointer",
    hdrs = [
        "public/pw_function/internal/static_invoker.h",
        "public/pw_function/pointer.h",
    ],
    strip_include_prefix = "public",
    tags = ["noclangtidy"],
)

pw_cc_test(
    name = "pointer_test",
    srcs = ["pointer_test.cc"],
    deps = [
        ":pointer",
        ":pw_function",
    ],
)

cc_library(
    name = "scope_guard",
    hdrs = ["public/pw_function/scope_guard.h"],
    strip_include_prefix = "public",
)

pw_cc_test(
    name = "scope_guard_test",
    srcs = ["scope_guard_test.cc"],
    deps = [
        ":pw_function",
        ":scope_guard",
    ],
)

# pw_function config for upstream builds.
#
# See https://pigweed.dev/pw_function/#dynamic-allocation for more context.
alias(
    name = "upstream_default_config",
    actual = selects.with_or({
        (
            "@platforms//os:android",
            "@platforms//os:chromiumos",
            "@platforms//os:fuchsia",
            "@platforms//os:linux",
            "@platforms//os:macos",
            "@platforms//os:windows",
        ): ":config_for_host",
        "//conditions:default": "//pw_build:default_module_config",
    }),
    visibility = ["//visibility:private"],
)

cc_library(
    name = "config_for_host",
    defines = [
        "PW_FUNCTION_ENABLE_DYNAMIC_ALLOCATION=1",
    ],
    visibility = [
        "//pw_function:__pkg__",
        "//targets/rp2040:__pkg__",
    ],
)

filegroup(
    name = "doxygen",
    srcs = [
        "public/pw_function/config.h",
        "public/pw_function/function.h",
        "public/pw_function/function_ref.h",
        "public/pw_function/pointer.h",
        "public/pw_function/scope_guard.h",
    ],
)

pw_size_diff(
    name = "callable_size_function_pointer_size_diff",
    base = "//pw_function/size_report:callable_size_base",
    label = "Function pointer",
    target = "//pw_function/size_report:callable_size_function_pointer",
)

pw_size_diff(
    name = "callable_size_static_lambda_size_diff",
    base = "//pw_function/size_report:callable_size_base",
    label = "Static lambda (operator+)",
    target = "//pw_function/size_report:callable_size_static_lambda",
)

pw_size_diff(
    name = "callable_size_simple_lambda_size_diff",
    base = "//pw_function/size_report:callable_size_base",
    label = "Non-capturing lambda",
    target = "//pw_function/size_report:callable_size_simple_lambda",
)

pw_size_diff(
    name = "callable_size_capturing_lambda_size_diff",
    base = "//pw_function/size_report:callable_size_base",
    label = "Simple capturing lambda",
    target = "//pw_function/size_report:callable_size_capturing_lambda",
)

pw_size_diff(
    name = "callable_size_multi_capturing_lambda_size_diff",
    base = "//pw_function/size_report:callable_size_base",
    label = "Multi-argument capturing lambda",
    target = "//pw_function/size_report:callable_size_multi_capturing_lambda",
)

pw_size_diff(
    name = "callable_size_custom_class_size_diff",
    base = "//pw_function/size_report:callable_size_base",
    label = "Custom class",
    target = "//pw_function/size_report:callable_size_custom_class",
)

pw_size_table(
    name = "function_size",
    reports = [
        ":callable_size_function_pointer_size_diff",
        ":callable_size_static_lambda_size_diff",
        ":callable_size_simple_lambda_size_diff",
        ":callable_size_capturing_lambda_size_diff",
        ":callable_size_multi_capturing_lambda_size_diff",
        ":callable_size_custom_class_size_diff",
    ],
)

sphinx_docs_library(
    name = "docs",
    srcs = [
        "Kconfig",
        "docs.rst",
        "function_test.cc",
        ":function_size",
    ],
    prefix = "pw_function/",
    target_compatible_with = incompatible_with_mcu(),
)
