// bslscm_versiontag.h                                                -*-C++-*-
#ifndef INCLUDED_BSLSCM_VERSIONTAG
#define INCLUDED_BSLSCM_VERSIONTAG

#include <bsls_ident.h>

BSLS_IDENT("$Id: $")

//@PURPOSE: Provide versioning information for the 'bsl' package group.
//
//@CLASSES:
//
//@MACROS:
//  BSL_VERSION_MAJOR: current release major version number
//  BSL_VERSION_MINOR: current release minor version number
//  BSL_MAKE_VERSION(MA, MI): create a combined version number
//  BSL_VERSION: combined version number for current release
//  BSL_GET_VERSION_MAJOR(vers): extract from 'vers' the major version
//  BSL_GET_VERSION_MINOR(vers): extract from 'vers' the minor version
//
//@SEE_ALSO: bslscm_version
//
//@DESCRIPTION: This component provides versioning information for the 'bsl'
// package group.  The 'BSL_VERSION' and 'BSL_MAKE_VERSION' macros that are
// supplied can be used for conditional-compilation based on 'bsl' version
// information.
//
// Note that the exact format of the values 'BSL_MAKE_VERSION' outputs is
// deliberately unspecified - it is subject to change without notice.  The only
// valid operations on the output of 'BSL_MAKE_VERSION' are comparing it with
// the result of other 'BSL_MAKE_VERSION' invocations, or using
// 'BSL_GET_VERSION_MAJOR' or 'BSL_GET_VERSION_MINOR' to extract the
// major/minor components respectively.
//
// The following usage example illustrates this basic capability.
//
///Usage
///-----
// At compile time, the version of BSL can be used to select an older or newer
// way to accomplish a task, to enable new functionality, or to accommodate an
// interface change.  For example, if the name of a function changes (a rare
// occurrence, but potentially disruptive when it does happen), the impact on
// affected code can be minimized by conditionally calling the function by its
// old or new name using conditional compilation.  In the following, the '#if'
// preprocessor directive compares 'BSL_VERSION' (i.e., the latest BSL version,
// excluding the patch version) to a specified major and minor version composed
// using the 'BSL_MAKE_VERSION' macro:
//..
//  #if BSL_VERSION > BSL_MAKE_VERSION(1, 3)
//      // Call 'newFunction' for BSL versions later than 1.3.
//      int result = newFunction();
//  #else
//      // Call 'oldFunction' for BSL version 1.3 or earlier.
//      int result = oldFunction();
//  #endif
//..

#include <bsls_bsldeprecationinformation.h>
    // For 'BSL_VERSION_DEPRECATION_THRESHOLD' macro definition that would have
    // been provided by this component if 'bsl' was a conforming package group.

#define BSL_VERSION_MAJOR    3
    // Provide the major version number of the current (latest) BSL release.

#define BSL_VERSION_MINOR    115
    // Provide the minor version number of the current (latest) BSL release.

#define BSL_MAKE_VERSION(major, minor) ((major) * 1000000 \
                                      + (minor) *     100)
    // Construct a composite version number from the specified 'major' and
    // 'minor' version numbers.  The result is unique for each combination of
    // 'major' and 'minor', and is sortable such that a value composed from a
    // given 'major' version number will compare larger than a value composed
    // from a smaller 'major' version number (and similarly for 'minor' version
    // numbers).  Note that if 'major' and 'minor' are both compile-time
    // integral constants, then the resulting expression is also a compile-time
    // integral constant.  Also note that the patch version number is
    // intentionally not included.  The behavior is undefined unless 'major'
    // is an integral value in the range '[0 .. 99]' and 'minor' is an
    // integral value in the range '[0 .. 9999]'.

#define BSL_GET_VERSION_MAJOR(version) ((version / 1000000) % 100)
    // Extract from the specified 'version' the corresponding major version.
    // 'version' is the result of a 'BSL_MAKE_VERSION(major, minor)'
    // invocation, and this macro returns 'major'.

#define BSL_GET_VERSION_MINOR(version) ((version / 100) % 10000)
    // Extract from the specified 'version' the corresponding minor version.
    // 'version' is the result of a 'BSL_MAKE_VERSION(major, minor)'
    // invocation, and this macro returns 'minor'.

#define BSL_VERSION BSL_MAKE_VERSION(BSL_VERSION_MAJOR, \
                                     BSL_VERSION_MINOR)
    // Construct an integer (unique to the specified 'BSL_VERSION_MAJOR' and
    // 'BSL_VERSION_MINOR' numbers) corresponding to the major and minor
    // version numbers, respectively, of the current (latest) BSL release.
    // Note that the patch version number is intentionally not included.

#endif

// ----------------------------------------------------------------------------
// Copyright 2013 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 ----------------------------------