#
# Copyright 2017 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
#
#      http://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.
#

list(APPEND TYPES_PUBLIC_HEADERS
  "any.h"
  "bad_any_cast.h"
  "bad_optional_access.h"
  "optional.h"
  "span.h"
  "variant.h"
)


# any library
absl_header_library(
  TARGET
    absl_any
  PUBLIC_LIBRARIES
    absl::bad_any_cast
    absl::base
    absl::meta
    absl::utility
  PRIVATE_COMPILE_FLAGS
    ${ABSL_EXCEPTIONS_FLAG}
  EXPORT_NAME
    any
)

# span library
absl_header_library(
  TARGET
    absl_span
  PUBLIC_LIBRARIES
    absl::utility
  EXPORT_NAME
    span
)


# bad_any_cast library
list(APPEND BAD_ANY_CAST_SRC
  "bad_any_cast.cc"
  ${TYPES_PUBLIC_HEADERS}
)

absl_library(
  TARGET
    absl_bad_any_cast
  SOURCES
    ${BAD_ANY_CAST_SRC}
  PUBLIC_LIBRARIES
  EXPORT_NAME
    bad_any_cast
)


# optional library
list(APPEND OPTIONAL_SRC
  "optional.cc"
)

absl_library(
  TARGET
    absl_optional
  SOURCES
    ${OPTIONAL_SRC}
  PUBLIC_LIBRARIES
    absl::bad_optional_access
    absl::base
    absl::memory
    absl::meta
    absl::utility
  EXPORT_NAME
    optional
)


set(BAD_OPTIONAL_ACCESS_SRC "bad_optional_access.cc")
set(BAD_OPTIONAL_ACCESS_LIBRARIES absl::base)

absl_library(
  TARGET
    absl_bad_optional_access
  SOURCES
    ${BAD_OPTIONAL_ACCESS_SRC}
  PUBLIC_LIBRARIES
    ${BAD_OPTIONAL_ACCESS_PUBLIC_LIBRARIES}
  EXPORT_NAME
    bad_optional_access
)

# variant library
absl_library(
  TARGET
    absl_variant
  SOURCES
    "bad_variant_access.h" "bad_variant_access.cc" "variant.h" "internal/variant.h"
  PUBLIC_LIBRARIES
    absl::base absl::meta absl::utility
  PRIVATE_COMPILE_FLAGS
    ${ABSL_EXCEPTIONS_FLAG}
  EXPORT_NAME
    variant
)

#
## TESTS
#


# test any_test
set(ANY_TEST_SRC "any_test.cc")
set(ANY_TEST_PUBLIC_LIBRARIES absl::base absl::throw_delegate absl::any absl::bad_any_cast test_instance_tracker_lib)

absl_test(
  TARGET
    any_test
  SOURCES
    ${ANY_TEST_SRC}
  PUBLIC_LIBRARIES
    ${ANY_TEST_PUBLIC_LIBRARIES}
  PRIVATE_COMPILE_FLAGS
    ${ABSL_EXCEPTIONS_FLAG}
)


# test any_test_noexceptions
absl_test(
  TARGET
    any_test_noexceptions
  SOURCES
    ${ANY_TEST_SRC}
  PUBLIC_LIBRARIES
    ${ANY_TEST_PUBLIC_LIBRARIES}
)

# test any_exception_safety_test
set(ANY_EXCEPTION_SAFETY_TEST_SRC "any_exception_safety_test.cc")
set(ANY_EXCEPTION_SAFETY_TEST_PUBLIC_LIBRARIES
  absl::any
  absl::base
  absl_base_internal_exception_safety_testing
)

absl_test(
  TARGET
    any_exception_safety_test
  SOURCES
    ${ANY_EXCEPTION_SAFETY_TEST_SRC}
  PUBLIC_LIBRARIES
    ${ANY_EXCEPTION_SAFETY_TEST_PUBLIC_LIBRARIES}
  PRIVATE_COMPILE_FLAGS
    ${ABSL_EXCEPTIONS_FLAG}
)


# test span_test
set(SPAN_TEST_SRC "span_test.cc")
set(SPAN_TEST_PUBLIC_LIBRARIES absl::base absl::strings absl::throw_delegate absl::span test_instance_tracker_lib)

absl_test(
  TARGET
    span_test
  SOURCES
    ${SPAN_TEST_SRC}
  PUBLIC_LIBRARIES
    ${SPAN_TEST_PUBLIC_LIBRARIES}
  PRIVATE_COMPILE_FLAGS
    ${ABSL_EXCEPTIONS_FLAG}
)


# test span_test_noexceptions
absl_test(
  TARGET
    span_test_noexceptions
  SOURCES
    ${SPAN_TEST_SRC}
  PUBLIC_LIBRARIES
    ${SPAN_TEST_PUBLIC_LIBRARIES}
)



# test optional_test
set(OPTIONAL_TEST_SRC "optional_test.cc")
set(OPTIONAL_TEST_PUBLIC_LIBRARIES absl::base absl::throw_delegate absl::optional absl_bad_optional_access)

absl_test(
  TARGET
    optional_test
  SOURCES
    ${OPTIONAL_TEST_SRC}
  PUBLIC_LIBRARIES
    ${OPTIONAL_TEST_PUBLIC_LIBRARIES}
)


# test optional_exception_safety_test
set(OPTIONAL_EXCEPTION_SAFETY_TEST_SRC "optional_exception_safety_test.cc")
set(OPTIONAL_EXCEPTION_SAFETY_TEST_PUBLIC_LIBRARIES
  absl::optional
  absl_base_internal_exception_safety_testing
)

absl_test(
  TARGET
    optional_exception_safety_test
  SOURCES
    ${OPTIONAL_EXCEPTION_SAFETY_TEST_SRC}
  PUBLIC_LIBRARIES
    ${OPTIONAL_EXCEPTION_SAFETY_TEST_PUBLIC_LIBRARIES}
  PRIVATE_COMPILE_FLAGS
    ${ABSL_EXCEPTIONS_FLAG}
)
