00001 00002 #ifndef _PermutationEnumerator_H_ 00003 #define _PermutationEnumerator_H_ 00004 00005 #include "VectorEnumerator.h" 00006 #include "Permutation.h" 00007 00008 00009 //---------------------------------------------------------------------------// 00010 //------------------------ PermutationEnumerator ----------------------------// 00011 //---------------------------------------------------------------------------// 00012 00013 00014 class PermutationEnumerator : public VectorEnumerator 00015 { 00016 00018 // // 00019 // Constructors // 00020 // // 00022 00023 public: 00024 00026 PermutationEnumerator( int L ) : theLength(L), theUsedElements( L , false ) { } 00027 00028 00030 PermutationEnumerator operator= ( const PermutationEnumerator& ); 00031 00032 00034 PermutationEnumerator( const PermutationEnumerator& ); 00035 00037 // // 00038 // Accessors // 00039 // // 00041 00042 public: 00043 00044 Permutation getPermutation( ) const { return Permutation( getSeq( ).begin( ) , getSeq( ).begin( )+theLength ); } 00045 00046 virtual bool seqOK ( ) const { 00047 int last_value = getSeq( )[getLength( )-1]; 00048 return !theUsedElements[last_value] && getLength( )<=theLength; 00049 } 00050 00051 virtual bool seqLimit ( ) const { 00052 return getLength( ) > theLength; 00053 } 00054 virtual bool seqComplete ( ) const { 00055 return theLength==getLength( ); 00056 } 00057 00058 virtual int start ( ) const { 00059 return 0; 00060 } 00061 virtual int next ( int cur ) const { 00062 return cur+1; 00063 } 00064 virtual bool finish( int cur ) const { 00065 return cur>=theLength; 00066 } 00067 00068 virtual void stepTo( ) { 00069 int last_value = getSeq( )[getLength( )-1]; 00070 theUsedElements[last_value] = true; 00071 } 00072 virtual void stepBack( int cur ) { 00073 int last_value = getSeq( )[getLength( )]; 00074 theUsedElements[last_value] = false; 00075 } 00076 00077 00079 // // 00080 // Data members // 00081 // // 00083 00084 private: 00085 00087 int theLength; 00088 00090 vector< bool > theUsedElements; 00091 }; 00092 00093 #endif