/* Copyright (c) 2001-2004 CrystalClear Software, Inc.
 * Use, modification and distribution is subject to the 
 * Boost Software License, Version 1.0. (See accompanying
 * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
 * Author: Jeff Garland 
 * $Date: 2008-03-26 17:16:15 -0400 (Wed, 26 Mar 2008) $
 */


/*! @mainpage Boost Date-Time Library Reference Documentation
 *  
 * 
 *@section intro Introduction
 *
 * The Boost Date-Time Library (originally the Generic Date-Time Library or GDTL) 
 * is a set of C++ date-time libraries based on the concepts of generic programming. 
 * This is an online reference guide generated from the source code
 * that provides a handy way to learn about the details of the 
 * library.  If you are a user you should start with the 
 * <a href="../user_docs/index.html">User Documentation</a>.
 *
 *@section using Using This Documentation
 *
 * The online documentation provides extensive information about the details
 * of the library including:
 * - <A href="inherits.html">Class hierarchy</A>
 * - <A href="namespaces.html">Namespace Documentation</A>
 * - List of <A href="files.html">source files</A>
 * - Annotated list of classes and structs  
 *   <A href="annotated.html">(Compound List)</A>
 *
 * For example, suppose you wanted to learn more about the 
 * gregorian::greg_month class.
 * You could alternatively browse the 
 * - <A href="classboost_1_1gregorian_1_1greg__month.html">Class documentation page</A>
 * - Include dependencies for greg_month.hpp
 * - Hyperlinked and colorized source files: <A href="greg__month_8hpp-source.html">[hpp file]</A> <A href="greg__month_8cpp-source.html">[cpp file]</A>
 *
 * The main navigation bar at the top provides that access to many 
 * different modes of naviation through the library.

 *  
 */

//! Overall boost namespace -- library does not put any symbols here
namespace boost {

//! Namespace for basic templates and components used to construct date-time systems
/*!
 This namespace encapsulates various types of templates and classes used 
 to construct coherent date-time systems including date, time, etc.  These
 components should be considered helper components to be utilized in the
 construction of specific date-time system implementations.  See namespace
 gregorian for one such example.
*/
namespace date_time {}

}
/*! Namespace for the c++ standard library.  Library does not define any symbols in the namespace, but uses some classes from this namespace.
*/
namespace std {}

/*!\class std::out_of_range
   \brief Exception class defined in c++ standard library.
  A derivative of std::logic_error and std::exception and base class for 
  many exceptions in the library.  See also:

   <a href="http://docs.mandragor.org/files/Programming_languages/Cpp/libstdcpp_v3_Source_Documentation/classstd_1_1out__of__range.html">Mandragor docs for libstdcpp_v3 std::out_of_range</a>
*/



