searchengine/oss/loc/analysis/inc/private/statemachine.h
author hgs
Fri, 15 Oct 2010 12:09:28 +0530
changeset 24 65456528cac2
permissions -rw-r--r--
201041
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
24
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* Initial Contributors:
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
*
hgs
parents:
diff changeset
    12
* Contributors:
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* Description: 
hgs
parents:
diff changeset
    15
*
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
#ifndef STATEMACHINE_H_
hgs
parents:
diff changeset
    19
#define STATEMACHINE_H_
hgs
parents:
diff changeset
    20
hgs
parents:
diff changeset
    21
#include <stdint.h>
hgs
parents:
diff changeset
    22
hgs
parents:
diff changeset
    23
namespace analysis {
hgs
parents:
diff changeset
    24
hgs
parents:
diff changeset
    25
	typedef uint8_t byte_t; 
hgs
parents:
diff changeset
    26
hgs
parents:
diff changeset
    27
	/**
hgs
parents:
diff changeset
    28
	 * Points to the beginning of the state in the memory
hgs
parents:
diff changeset
    29
	 */
hgs
parents:
diff changeset
    30
	typedef byte_t* StatePointer;
hgs
parents:
diff changeset
    31
hgs
parents:
diff changeset
    32
	/**
hgs
parents:
diff changeset
    33
	 * Points to the begining of the state as calculated
hgs
parents:
diff changeset
    34
	 * from the beginning of the state machine blob. Can be
hgs
parents:
diff changeset
    35
	 * turned into a StatePointer by combining it with the 
hgs
parents:
diff changeset
    36
	 * state machine blob pointer. 
hgs
parents:
diff changeset
    37
	 */
hgs
parents:
diff changeset
    38
	typedef unsigned int StateOffset;
hgs
parents:
diff changeset
    39
hgs
parents:
diff changeset
    40
	/**
hgs
parents:
diff changeset
    41
	 * Can be used for navigating throught the state machine
hgs
parents:
diff changeset
    42
	 * staets. In a sense 'a pointer' to some state. Can be used 
hgs
parents:
diff changeset
    43
	 * to read information of the state or to jump to another location
hgs
parents:
diff changeset
    44
	 * Must be reset before usage.
hgs
parents:
diff changeset
    45
	 * 
hgs
parents:
diff changeset
    46
	 * @tparam Encoding describes encoding of the state machine binary
hgs
parents:
diff changeset
    47
	 */
hgs
parents:
diff changeset
    48
	template <class Encoding>
hgs
parents:
diff changeset
    49
	class StateCursor {
hgs
parents:
diff changeset
    50
		
hgs
parents:
diff changeset
    51
	public:
hgs
parents:
diff changeset
    52
		/** Constructs the cursor. */
hgs
parents:
diff changeset
    53
		StateCursor();
hgs
parents:
diff changeset
    54
		
hgs
parents:
diff changeset
    55
		/** 
hgs
parents:
diff changeset
    56
		 * Resets the state cursor to point to a new location. After
hgs
parents:
diff changeset
    57
		 * first reset other methods can be used.
hgs
parents:
diff changeset
    58
		 * @param blob State machine binary. Ownership NOT transferred 
hgs
parents:
diff changeset
    59
		 * @param offset Points to a state within the state machine binary 
hgs
parents:
diff changeset
    60
		 */
hgs
parents:
diff changeset
    61
		void reset(byte_t* blob, StateOffset offset);
hgs
parents:
diff changeset
    62
		
hgs
parents:
diff changeset
    63
		/** 
hgs
parents:
diff changeset
    64
		 * Describes, if this state is a terminal state.
hgs
parents:
diff changeset
    65
		 * @note Must not be used before reset() is once called  
hgs
parents:
diff changeset
    66
		 */
hgs
parents:
diff changeset
    67
		bool isFinal();
hgs
parents:
diff changeset
    68
		
hgs
parents:
diff changeset
    69
		/** 
hgs
parents:
diff changeset
    70
		 * Moves to next state based on the input. Returns false, 
hgs
parents:
diff changeset
    71
		 * if no transition for input was found.
hgs
parents:
diff changeset
    72
		 * @note Must not be used before reset() is once called  
hgs
parents:
diff changeset
    73
		 * @param c An input character. 
hgs
parents:
diff changeset
    74
		 * @returns True, if state did change, false otherwise  
hgs
parents:
diff changeset
    75
		 */
hgs
parents:
diff changeset
    76
		bool next(wchar_t c);
hgs
parents:
diff changeset
    77
		
hgs
parents:
diff changeset
    78
	private: 
hgs
parents:
diff changeset
    79
		/** State machine binary. Does NOT hold ownership */
hgs
parents:
diff changeset
    80
		byte_t* blob_; 
hgs
parents:
diff changeset
    81
		
hgs
parents:
diff changeset
    82
		/** Raw memory pointer to the state. State is within state machine binary */
hgs
parents:
diff changeset
    83
		StatePointer pointer_; 
hgs
parents:
diff changeset
    84
	};
hgs
parents:
diff changeset
    85
hgs
parents:
diff changeset
    86
	/**
hgs
parents:
diff changeset
    87
	 * Represents the state machine. Mainly wraps the state machine binary.
hgs
parents:
diff changeset
    88
	 * Can be used to reset StateCursors
hgs
parents:
diff changeset
    89
	 *   
hgs
parents:
diff changeset
    90
	 * @tparam Encoding describes the encoding of the state machine binary
hgs
parents:
diff changeset
    91
	 */
hgs
parents:
diff changeset
    92
	template<class Encoding>
hgs
parents:
diff changeset
    93
	class StateMachine {
hgs
parents:
diff changeset
    94
		public: 
hgs
parents:
diff changeset
    95
		
hgs
parents:
diff changeset
    96
			static const StateOffset ROOT_STATE_OFFSET;
hgs
parents:
diff changeset
    97
			
hgs
parents:
diff changeset
    98
		public:
hgs
parents:
diff changeset
    99
		
hgs
parents:
diff changeset
   100
			/** 
hgs
parents:
diff changeset
   101
			 * Constructs state. State machine is not functional, before
hgs
parents:
diff changeset
   102
			 * reset is called
hgs
parents:
diff changeset
   103
			 */
hgs
parents:
diff changeset
   104
			StateMachine();
hgs
parents:
diff changeset
   105
			
hgs
parents:
diff changeset
   106
			/**
hgs
parents:
diff changeset
   107
			 * Loads the state machine with the state machine binary.
hgs
parents:
diff changeset
   108
			 * @param blob The state machine binary. Ownership is NOT transferred.
hgs
parents:
diff changeset
   109
			 */
hgs
parents:
diff changeset
   110
			void reset(byte_t* blob); 
hgs
parents:
diff changeset
   111
			
hgs
parents:
diff changeset
   112
			/**
hgs
parents:
diff changeset
   113
			 * Resets the cursor to point out to this state machine's
hgs
parents:
diff changeset
   114
			 * root state.
hgs
parents:
diff changeset
   115
			 * @param cursor this cursor is set to point to the state machine's root state. 
hgs
parents:
diff changeset
   116
			 * @note Must not be called before StateMachine is properly reset
hgs
parents:
diff changeset
   117
			 */
hgs
parents:
diff changeset
   118
			void rootState(StateCursor<Encoding>& cursor);
hgs
parents:
diff changeset
   119
			
hgs
parents:
diff changeset
   120
		private: 
hgs
parents:
diff changeset
   121
			
hgs
parents:
diff changeset
   122
			/** State machine binary. Does NOT hold ownership */
hgs
parents:
diff changeset
   123
			byte_t* blob_;
hgs
parents:
diff changeset
   124
	};
hgs
parents:
diff changeset
   125
}
hgs
parents:
diff changeset
   126
hgs
parents:
diff changeset
   127
#include "statemachine.inl"
hgs
parents:
diff changeset
   128
hgs
parents:
diff changeset
   129
#endif /* STATEMACHINE_H_ */