#pragma once

#pragma warning ( disable : 4290 )

#include "TestDocException.h"
#include "TestDocBase.h"
#include "String.h"



/**
 * Class for documentation testing.  Some inline stuff is to follow.<br>
 * The document root path is: {@docroot}<br>
 * Here are the source files: {@files}<br>
 * Here is source file 1: {@file1}<br>
 * Here is source file 2: {@file2}
 * 
 * @author  rico suave
 * @version  2.0
 * @see "The help file"
 * @see #getStr
 * @see Code.Foo
 * @see <a href="http://www.cppdoc.com/cppdoc">the CppDoc website</a>
 * @since version 1.0
 */
class TestDoc : public TestDocBase
{
public:
    /**
     * A constructor.
     */
    TestDoc( long x )
    {
    }


    virtual ~TestDoc();


    /**
     * A test function to show off the <code>@param</code> tag.
     * Note that the <code>throw</code> specification in the function declaration is not
     * required for the <code>@throw</code> tag.
     *
     * @throw TestDocException when anything bad happens
     * @param x the first parameter... which isn't used
     * @param y another unused parameter
     * @return the String "hi"
     */
    String getStr( int x, float y ) throw( TestDocException )
    {
        if ( true )
            throw TestDocException();
        return "hi";
    }


    /**
     * Here's a link: {@link TestDocBase#protectedBaseMethod(int) (Click Me!)}, and
     * here's another link: {@link #getStr}, and
     * here's an unresolvable link: {@link NonexistantClass#foo foo}.
     * @see #getStr
     * @see #someDeprecatedMethod
     */
#ifdef PREPROCESSOR_TEST
    void bar( String thisIsFromPreprocessorTest )
#else
    void bar()
#endif
    {
    }


    /**
     * This is some documentation attached to a
     * deprecated method.
     * @deprecated This method doesn't do anything.  Use {@link #bar the bar() function}
     *             instead.
     */
    void someDeprecatedMethod()
    {
    }


protected:
    /**
     * This is a plain ol' doc comment on a protected method.
     */
    int plainOlFunc()
    {
    }


    /**
     * A static method.
     */
    static float someStaticFunc( int* arg )
    {
        return 0;
    }


private:
    /**
     * This private method will only get documented if you enable documentation
     * of private members.
     */
    void privateFunc()
    {
    }
};