#
# 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::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
    absl::base absl::any
  EXPORT_NAME
    bad_any_cast
)


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

absl_library(
  TARGET
    absl_optional
  SOURCES
    ${OPTIONAL_SRC}
  PUBLIC_LIBRARIES
    absl::base
  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}
)


