/*
 *******************************************************************************
 *
 *   Copyright (C) 2003, International Business Machines
 *   Corporation and others.  All Rights Reserved.
 *
 *******************************************************************************
 *   file name:  nameprep.h
 *   encoding:   US-ASCII
 *   tab size:   8 (not used)
 *   indentation:4
 *
 *   created on: 2003feb1
 *   created by: Ram Viswanadha
 */

#ifndef NAMEPREP_H
#define NAMEPREP_H

#include "unicode/utypes.h"

#if !UCONFIG_NO_IDNA

#include "strprep.h"
#include "unicode/uniset.h"


U_NAMESPACE_BEGIN
/*
   A profile of stringprep MUST include all of the following:

   - The intended applicability of the profile

   - The character repertoire that is the input and output to stringprep
     (which is Unicode 3.2 for this version of stringprep)

   - The mapping tables from this document used (as described in section
     3)

   - Any additional mapping tables specific to the profile

   - The Unicode normalization used, if any (as described in section 4)

   - The tables from this document of characters that are prohibited as
     output (as described in section 5)

   - The bidirectional string testing used, if any (as described in
     section 6)

   - Any additional characters that are prohibited as output specific to
     the profile
*/


class NamePrep: public StringPrep {
public :
    NamePrep(UErrorCode& status);
    
    virtual inline ~NamePrep(){};

    virtual inline UBool isNotProhibited(UChar32 ch);
    
    /**
     * ICU "poor man's RTTI", returns a UClassID for the actual class.
     *
     * @draft ICU 2.6
     */
    virtual inline UClassID getDynamicClassID() const { return getStaticClassID(); }

    /**
     * ICU "poor man's RTTI", returns a UClassID for this class.
     *
     * @draft ICU 2.6
     */
    static inline UClassID getStaticClassID() { return (UClassID)&fgClassID; }

private:        
    /**
     * The address of this static class variable serves as this class's ID
     * for ICU "poor man's RTTI".
     */
    static const char fgClassID;
};



U_NAMESPACE_END

#endif /* #if !UCONFIG_NO_IDNA */

#endif

/*
 * Hey, Emacs, please set the following:
 *
 * Local Variables:
 * indent-tabs-mode: nil
 * End:
 *
 */
