# 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.

import("//build_overrides/pigweed.gni")

import("$dir_pw_bloat/bloat.gni")
import("$dir_pw_build/module_config.gni")
import("$dir_pw_build/target_types.gni")
import("$dir_pw_docgen/docs.gni")
import("$dir_pw_unit_test/test.gni")

declare_args() {
  # The build target that overrides the default configuration options for this
  # module. This should point to a source set that provides defines through a
  # public config (which may -include a file or add defines directly).
  pw_function_CONFIG = pw_build_DEFAULT_MODULE_CONFIG
}

config("public_include_path") {
  include_dirs = [ "public" ]
  visibility = [ ":*" ]
}

pw_source_set("config") {
  public = [ "public/pw_function/config.h" ]
  public_configs = [ ":public_include_path" ]
  public_deps = [ pw_function_CONFIG ]
  visibility = [ ":*" ]
}

pw_source_set("pw_function") {
  public_configs = [ ":public_include_path" ]
  public_deps = [
    ":config",
    dir_pw_assert,
    dir_pw_preprocessor,
  ]
  public = [ "public/pw_function/function.h" ]
  sources = [ "public/pw_function/internal/function.h" ]
}

pw_doc_group("docs") {
  sources = [ "docs.rst" ]
  report_deps = [
    ":callable_size",
    ":function_size",
  ]
}

pw_test_group("tests") {
  tests = [ ":function_test" ]
}

pw_test("function_test") {
  deps = [
    ":pw_function",
    dir_pw_polyfill,
  ]
  sources = [ "function_test.cc" ]
}

pw_size_report("function_size") {
  title = "Pigweed function size report"

  binaries = [
    {
      target = "size_report:basic_function"
      base = "size_report:pointer_base"
      label = "Simple pw::Function vs. function pointer"
    },
  ]
}

pw_size_report("callable_size") {
  title = "Size comparison of callable objects"

  binaries = [
    {
      target = "size_report:callable_size_function_pointer"
      base = "size_report:callable_size_base"
      label = "Function pointer"
    },
    {
      target = "size_report:callable_size_static_lambda"
      base = "size_report:callable_size_base"
      label = "Static lambda (operator+)"
    },
    {
      target = "size_report:callable_size_simple_lambda"
      base = "size_report:callable_size_base"
      label = "Non-capturing lambda"
    },
    {
      target = "size_report:callable_size_capturing_lambda"
      base = "size_report:callable_size_base"
      label = "Simple capturing lambda"
    },
    {
      target = "size_report:callable_size_multi_capturing_lambda"
      base = "size_report:callable_size_base"
      label = "Multi-argument capturing lambda"
    },
    {
      target = "size_report:callable_size_custom_class"
      base = "size_report:callable_size_base"
      label = "Custom class"
    },
  ]
}
