// SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
// SPDX-FileCopyrightText: Copyright 2008 Sandia Corporation
// SPDX-License-Identifier: LicenseRef-BSD-3-Clause-Sandia-USGov

#ifndef vtkDeprecation_h
#define vtkDeprecation_h

#include "vtkVersionQuick.h"

//----------------------------------------------------------------------------
// These macros may be used to deprecate APIs in VTK. They act as attributes on
// method declarations and do not remove methods from a build based on build
// configuration.
//
// To use:
//
// In the declaration:
//
// ```cxx
// VTK_DEPRECATED_IN_9_1_0("reason for the deprecation")
// void oldApi();
// ```
// or
// ```cxx
// class VTK_DEPRECATED_IN_X_Y_Z("reason for deprecation") OPT_EXPORT_MACRO oldClass {
// ```
//
// When selecting which version to deprecate an API in, use the newest macro
// available in this header.
//
// In the implementation:
//
// ```cxx
// // Hide VTK_DEPRECATED_IN_X_Y_Z() warnings for this class.
// #define VTK_DEPRECATION_LEVEL 0
//
// #include …
// ```
//
// Please note the `VTK_DEPRECATED_IN_` version in the `VTK_DEPRECATION_LEVEL`
// comment so that it can be removed when that version is finally removed. The
// macro should also be defined before any includes.
//----------------------------------------------------------------------------

// The level at which warnings should be made.
#ifndef VTK_DEPRECATION_LEVEL
// VTK defaults to deprecation of its current version.
#ifdef VTK_VERSION_NUMBER
#define VTK_DEPRECATION_LEVEL VTK_VERSION_NUMBER
#else
#define VTK_DEPRECATION_LEVEL VTK_VERSION_NUMBER_QUICK
#endif
#endif

// API deprecated before 9.4.0 have already been removed.
#define VTK_MINIMUM_DEPRECATION_LEVEL VTK_VERSION_CHECK(9, 4, 0)

// Force the deprecation level to be at least that of VTK's build
// configuration.
#if VTK_DEPRECATION_LEVEL < VTK_MINIMUM_DEPRECATION_LEVEL
#undef VTK_DEPRECATION_LEVEL
#define VTK_DEPRECATION_LEVEL VTK_MINIMUM_DEPRECATION_LEVEL
#endif

// Deprecation macro support for various compilers.
#if defined(VTK_WRAPPING_CXX)
// Ignore deprecation in wrapper code.
#define VTK_DEPRECATION(reason)
#elif defined(__VTK_WRAP__)
#define VTK_DEPRECATION(reason) [[vtk::deprecated(reason)]]
#else
#define VTK_DEPRECATION(reason) [[deprecated(reason)]]
#endif

// APIs deprecated in the next release.
#if defined(__VTK_WRAP__)
#define VTK_DEPRECATED_IN_9_6_0(reason) [[vtk::deprecated(reason, "9.6.0")]]
#elif VTK_DEPRECATION_LEVEL >= VTK_VERSION_CHECK(9, 5, 20250513)
#define VTK_DEPRECATED_IN_9_6_0(reason) VTK_DEPRECATION(reason)
#else
#define VTK_DEPRECATED_IN_9_6_0(reason)
#endif

// APIs deprecated in 9.5.0.
#if defined(__VTK_WRAP__)
#define VTK_DEPRECATED_IN_9_5_0(reason) [[vtk::deprecated(reason, "9.5.0")]]
#elif VTK_DEPRECATION_LEVEL >= VTK_VERSION_CHECK(9, 4, 20241008)
#define VTK_DEPRECATED_IN_9_5_0(reason) VTK_DEPRECATION(reason)
#else
#define VTK_DEPRECATED_IN_9_5_0(reason)
#endif

// APIs deprecated in the older release always warn.
#if defined(__VTK_WRAP__)
#define VTK_DEPRECATED_IN_9_4_0(reason) [[vtk::deprecated(reason, "9.4.0")]]
#else
#define VTK_DEPRECATED_IN_9_4_0(reason) VTK_DEPRECATION(reason)
#endif

#if defined(__VTK_WRAP__)
#define VTK_DEPRECATED_IN_9_3_0(reason) [[vtk::deprecated(reason, "9.3.0")]]
#else
#define VTK_DEPRECATED_IN_9_3_0(reason) VTK_DEPRECATION(reason)
#endif

#if defined(__VTK_WRAP__)
#define VTK_DEPRECATED_IN_9_2_0(reason) [[vtk::deprecated(reason, "9.2.0")]]
#else
#define VTK_DEPRECATED_IN_9_2_0(reason) VTK_DEPRECATION(reason)
#endif

#if defined(__VTK_WRAP__)
#define VTK_DEPRECATED_IN_9_1_0(reason) [[vtk::deprecated(reason, "9.1.0")]]
#else
#define VTK_DEPRECATED_IN_9_1_0(reason) VTK_DEPRECATION(reason)
#endif

#if defined(__VTK_WRAP__)
#define VTK_DEPRECATED_IN_9_0_0(reason) [[vtk::deprecated(reason, "9.0.0")]]
#else
#define VTK_DEPRECATED_IN_9_0_0(reason) VTK_DEPRECATION(reason)
#endif

#if defined(__VTK_WRAP__)
#define VTK_DEPRECATED_IN_8_2_0(reason) [[vtk::deprecated(reason, "8.2.0")]]
#else
#define VTK_DEPRECATED_IN_8_2_0(reason) VTK_DEPRECATION(reason)
#endif

#endif

// VTK-HeaderTest-Exclude: vtkDeprecation.h
