/*
* Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description: 
*    
*
*/



#ifndef C_STATE_MACHINE_H
#define C_STATE_MACHINE_H

#include "NumberGroupingStd.h"

NONSHARABLE_CLASS(CStateMachine) : public CBase
{
public:
	static CStateMachine*	NewL(TInt aMaxNumberChars, TInt aMaxNumberStates);
	static CStateMachine*	NewLC(TInt aMaxNumberChars, TInt aMaxNumberStates);

	virtual ~CStateMachine();

	void			AddStateTransistionL(TChar aChar, TInt aState, TInt aNextState);
	void			AddStateTransistionL(TInt aDigit, TInt aState, TInt aNextState);

	TBool			Matches(const TDesC& aString);
    
    /**
    * This routine writes into a client supplied descriptor a string that is a wildcard version
    * of the pattern match for this state machine.  It writes characters into the supplied descriptor
    * to a length of the maximum number of characters to match. 
    * For each character index, if there is only one possible valid character, it puts in that 
    * character.  If there are more than one, then the supplied aWildcardChar is written in.
    * The character '.' in the state machine is not treated as a single character, but as a range,
    * and so the wildcard character is written in for the '.'.
    * 
    * aWildcardPattern must have MaxLength which is equal or greater than iMaxNumberStates
    * 
    * @param    aWildcardChar   The character to put in aExamplePattern if there is no single 
    *                           valid character at that point
    * @param    aWildcardedPattern Descriptor to write the wildcarded number pattern into
    */
    void            GetWildcardVersionOfPattern( 
        TText aWildcardChar, 
        TDes& aWildcardedPattern ) const;

private:
	CStateMachine(TInt aMaxNumberChars, TInt aMaxNumberStates);

	void			ConstructL();
	virtual TInt	MapIndex(TChar aChar, RArray<TInt>& aIndices);
	
	TInt**			iStateTable;
	TInt			iMaxNumberChars;
	TInt			iMaxNumberStates;
};

#endif // C_STATE_MACHINE_H
// End of File
