opyright (C) 1996-1999, International Business Machines
*   Corporation and others.  All Rights Reserved.
**********************************************************************
*
*  FILE NAME: DOCMAIN.h
*
*   Date          Name        Description
*   12/11/2000    Ram	      Creation.
*/
/* This file contains documentation for Doxygen and doesnot have
 * any significance with respect to C or C++ API
 */
/*! \mainpage
 *
 * \section Usage
 * <h2> API Reference Usage </h2>
 *
 * <h3> C++ Programmers:</h3>
 * Use  <a href="hierarchy.html">Class Hierarchy</a> or <a href="classes.html> Alphabetical List </a>
 * or <a href="annotated.html"> Compound List</a>
 * to find the class you are interested in. For example, to find BreakIterator,
 * you can go to the <a href="classes.html"> Alphabetical List</a>, then click on
 * "BreakIterator". Once you are at the class, you will find an inheritance
 * chart, a list of the public members, a detailed description of the class,
 * then detailed member descriptions.
 *
 * <h4>C Programmers: </h4>
 * Use <a href="#Module">Module List</a> or <a href="globals.html"> File Members</a>
 * to find a list of all the functions and constants.
 * For example, to find BreakIterator functions you would click on
 * <a href="files.html"> File List</a>,
 * then find "ubrk.h" and click on it. You will find descriptions of Defines,
 * Typedefs, Enumerations, and Functions, with detailed descriptions below.
 * If you want to find a specific function, such as ubrk_next(), then click
 * first on <a href="globals.html"> File Members</a>, then use your browser
 * Find dialog to search for "ubrk_next()".
 *
 *
 * <hr>
 * <h5> Architecture  (User Guide)</h5>
 * <ul>
 *    <li>
 *       <b><a href="http://oss.software.ibm.com/icu/userguide/index.html"> Introduction </a></b>
 *    <li>
 *       <b><a href="http://oss.software.ibm.com/icu/userguide/i18n.html"> Internationalization </a></b>
 *    <li>
 *       <b><a href="http://oss.software.ibm.com/icu/userguide/design.html"> Locale Model </a></b>
 *    <li>
 *       <b><a href="http://oss.software.ibm.com/icu/userguide/design.html"> Multithreading</a></b>
 *    <li>
 *       <b><a href="http://oss.software.ibm.com/icu/userguide/conversion.html"> Conversion </a></b>
 *    <li>
 *       <b><a href="http://oss.software.ibm.com/icu/userguide/design.html"> Error Handling  </a></b>
 * </ul>
 * <hr>
 * <h6> <a name="Module">Module List</h6>
 * <center>
 * <table BORDER COLS=3 WIDTH="50%" >
 * <tr>
 * <td><b>Description</b></td>
 * <td><b>C</b> </td>
 * <td><b>C++</b> </td>
 * </tr>
 * <tr>
 * <td> Basic types, constants and enumerations </td>
 * \htmlonly
 * <td colspan=2><a class="el" href="utypes_h.html"> utypes.h</a> </td>
 * \endhtmlonly
 * </tr>
 * <tr>
 * <td>String and Character Iteration</td>
 * <td>chariter.h, ustring.h, utf.h, uchar.h</td>
 * <td>CharacterIterator, Unicode, UnicodeString</td>
 * </tr>
 * <tr>
 * <td>Codepage conversion</td>
 * <td>ucnv.h</td>
 * <td>UnicodeConverter</td>
 * </tr>
 * <tr>
 * <td>Locales </td>
 * <td>uloc.h</a></td>
 * <td>Locale</td>
 * </tr>
 * <tr>
 * <td>Resource Bundles</td>
 * <td>ures.h</td>
 * <td>ResourceBundle</td>
 * </tr>
 * <tr>
 * <td>Date and Time Formatting</td>
 * <td>udat.h</td>
 * <td>DateFormat</td>
 * </tr>
 * <tr>
 * <td>Calendars</td>
 * <td>ucal.h</td>
 * <td>Calendar</td>
 * </tr>
 * <tr>
 * <td>Message Formatting</td>
 * <td>umsg.h</td>
 * <td>MessageFormat</td>
 * </tr>
 * <tr>
 * <td>Number Formatting</td>
 * <td>umsg.h</td>
 * <td>NumberFormat</td>
 * </tr>
 * <tr>
 * <td>Normalization</td>
 * <td>unorm.h</td>
 * <td>Normalizer</td>
 * </tr>
 * <tr>
 * <td>Transliteration</td>
 * <td>utrans.h</td>
 * <td>Transliterator
 * </td>
 * </tr>
 * <tr>
 * <td>Bidirectional Algorithm</td>
 * <td>ubidi.h</td>
 * <td>BiDi</td>
 * </tr>
 * <tr>
 * <tr>
 * <td>Collation and Searching</td>
 * <td>ucol.h</td>
 * <td>Collator</td>
 * </tr>
 * <tr>
 * <td>Text boundary analysis (Break Iteration)</td>
 * <td>ubrk.h</td>
 * <td>BreakIterator</td>
 * </tr>
 * <tr>
 * <td>Compression. (Deprecated)</td>
 * <td>scsu.h</td>
 * <td>N.A</td>
 * </tr>
 * <tr>
 * <td>Arabic Shaping</td>
 * <td>ushape.h</td>
 * <td>N.A</td>
 * </tr>
 * </table>
 * </center>
 */

