// bslstl_badoptionalaccess.h                                         -*-C++-*-
#ifndef INCLUDED_BSLSTL_BADOPTIONALACCESS
#define INCLUDED_BSLSTL_BADOPTIONALACCESS

#include <bsls_ident.h>
BSLS_IDENT("$Id: $")

//@PURPOSE: Provide an exception class thrown by 'bsl::optional'.
//
//@CLASSES:
//  bsl::bad_optional_access: exception type thrown by 'bsl::optional'
//
//@SEE_ALSO: bslstl_optional, bslstl_stdexceptionutil
//
//@DESCRIPTION: This component provides a 'bsl::bad_optional_access' exception
// class.  This exception is thrown by 'bsl::optional::value' when accessing a
// 'bsl::optional' object that does not contain a value.  If 'std::optional'
// implementation is available, 'bsl::bad_optional_access' is an alias to
// 'std::bad_optional_access'.
//

#include <bslscm_version.h>

#include <bsls_exceptionutil.h>
#include <bsls_keyword.h>
#include <bsls_libraryfeatures.h>

#include <exception>

#ifdef BDE_BUILD_TARGET_EXC

#ifdef BSLS_LIBRARYFEATURES_HAS_CPP17_BASELINE_LIBRARY
#include <optional> // for 'std::bad_optional_access'
#endif // BSLS_LIBRARYFEATURES_HAS_CPP17_BASELINE_LIBRARY

namespace bsl {
#ifdef BSLS_LIBRARYFEATURES_HAS_CPP17_BASELINE_LIBRARY
typedef std::bad_optional_access bad_optional_access;
#else
                       // =========================
                       // class bad_optional_access
                       // =========================

class bad_optional_access : public std::exception {
  public:
    // CREATORS
    bad_optional_access() BSLS_KEYWORD_NOEXCEPT;
        // Create a 'bad_optional_access' object.  Note that this function is
        // explicitly user-declared, to make it simple to declare 'const'
        // objects of this type.

    // ACCESSORS
    const char *what() const BSLS_EXCEPTION_VIRTUAL_NOTHROW
                                                         BSLS_KEYWORD_OVERRIDE;
        // Return a pointer to the string literal "bad_optional_access", with a
        // storage duration of the lifetime of the program.  Note that the
        // caller should *not* attempt to free this memory.  Note that the
        // 'bsls_exceptionutil' macro 'BSLS_NOTHROW_SPEC' is deliberately not
        // used here, as a number of standard libraries declare 'what' in the
        // base 'exception' class explicitly with the no-throw specification,
        // even in a build that may not recognize exceptions.
};

// ============================================================================
//                           INLINE DEFINITIONS
// ============================================================================

                       // -------------------------
                       // class bad_optional_access
                       // -------------------------

inline
bad_optional_access::bad_optional_access() BSLS_KEYWORD_NOEXCEPT
: std::exception()
{
}

inline
const char *bad_optional_access::what() const BSLS_EXCEPTION_VIRTUAL_NOTHROW
{
    return "bad_optional_access";
}
#endif // BSLS_LIBRARYFEATURES_HAS_CPP17_BASELINE_LIBRARY

}  // close namespace bsl

#endif // BDE_BUILD_TARGET_EXC
#endif

// ----------------------------------------------------------------------------
// Copyright 2020 Bloomberg Finance L.P.
//
// 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.
// ----------------------------- END-OF-FILE ----------------------------------