<!--
    Licensed to the Apache Software  Foundation (ASF) under one or more
    contributor  license agreements.  See  the NOTICE  file distributed
    with  this  work  for  additional information  regarding  copyright
    ownership.   The ASF  licenses this  file to  you 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.

    Copyright 1999-2007 Rogue Wave Software, Inc.
-->

<html>
    <head>
        <title>Apache C++ Standard Library Documentation</title>
        <link rel=StyleSheet href="rw.css" type="text/css" title="Apache stdcxx Stylesheet">
        <meta http-equiv="content-type" content="text/html" charset="iso-8859-1"/>
    </head>

    <body bgcolor=#FFFFFF>
        <h1>Apache C++ Standard Library Documentation</h1>

        <h2>
            <a href="./stdlibref/index.html">Class Reference</a>
            <br><br>
            <a href="./stdlibug/index.html">User's Guide</a>
        </h2>

        <!-- Google Analytics tracking code -->
        <script src="http://www.google-analytics.com/urchin.js" type="text/javascript">
        </script>
        <script type="text/javascript">
            _uacct = "UA-1775151-1";
            urchinTracker();
        </script>

    </body>
</html>
