Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / third_party / icu / source / tools / ctestfw / unicode / uperf.h
1 /*
2 **********************************************************************
3 * Copyright (c) 2002-2011, International Business Machines
4 * Corporation and others.  All Rights Reserved.
5 **********************************************************************
6 */
7 #ifndef _UPERF_H
8 #define _UPERF_H
9
10 #include "unicode/utypes.h"
11 #include "unicode/unistr.h"
12 #include "unicode/ustring.h"
13
14 #include "unicode/testtype.h"
15 #include "unicode/utimer.h"
16 #include "ucbuf.h"
17
18 // Forward declarations from uoptions.h.
19 struct UOption;
20 typedef struct UOption UOption;
21
22 #if !UCONFIG_NO_CONVERSION
23
24 U_NAMESPACE_USE
25 // Use the TESTCASE macro in subclasses of IntlTest.  Define the
26 // runIndexedTest method in this fashion:
27 //
28 //| void MyTest::runIndexedTest(int32_t index, UBool exec,
29 //|                             const char* &name, char* /*par*/) {
30 //|     switch (index) {
31 //|         TESTCASE(0,TestSomething);
32 //|         TESTCASE(1,TestSomethingElse);
33 //|         TESTCASE(2,TestAnotherThing);
34 //|         default: 
35 //|             name = ""; 
36 //|             return NULL;
37 //|     }
38 //| }
39 #if 0
40 #define TESTCASE(id,test)                       \
41     case id:                                    \
42         name = #test;                           \
43         if (exec) {                             \
44             fprintf(stdout,#test "---");        \
45             fprintf(stdout,"\n");               \
46             return test();                      \
47         }                                       \
48         break
49
50 #endif
51 #define TESTCASE(id,test)                       \
52     case id:                                    \
53         name = #test;                           \
54         if (exec) {                             \
55             return test();                      \
56         }                                       \
57         break
58
59 /**
60  * Subclasses of PerfTest will need to create subclasses of
61  * Function that define a call() method which contains the code to
62  * be timed.  They then call setTestFunction() in their "Test..."
63  * method to establish this as the current test functor.
64  */
65 class T_CTEST_EXPORT_API UPerfFunction {
66 public:
67     /**
68      * destructor
69      */
70     virtual ~UPerfFunction();
71
72     /**
73      * Subclasses must implement this method to do the action to be
74      * measured.
75      */
76     virtual void call(UErrorCode* status)=0;
77
78     /**
79      * Subclasses must implement this method to return positive
80      * integer indicating the number of operations in a single
81      * call to this object's call() method.
82      */
83     virtual long getOperationsPerIteration()=0;
84     /**
85      * Subclasses should override this method to return either positive
86      * or negative integer indicating the number of events in a single
87      * call to this object's call() method, if applicable
88      * e.g: Number of breaks / iterations for break iterator
89      */
90     virtual long getEventsPerIteration(){
91         return -1;
92     }
93     /**
94      * Call call() n times in a tight loop and return the elapsed
95      * milliseconds.  If n is small and call() is fast the return
96      * result may be zero.  Small return values have limited
97      * meaningfulness, depending on the underlying CPU and OS.
98      */
99      virtual double time(int32_t n, UErrorCode* status) {
100         UTimer start, stop;
101         utimer_getTime(&start); 
102         while (n-- > 0) {
103             call(status);
104         }
105         utimer_getTime(&stop);
106         return utimer_getDeltaSeconds(&start,&stop); // ms
107     }
108
109 };
110
111
112 class T_CTEST_EXPORT_API UPerfTest {
113 public:
114     UBool run();
115     UBool runTest( char* name = NULL, char* par = NULL ); // not to be overidden
116         
117     virtual void usage( void ) ;
118     
119     virtual ~UPerfTest();
120
121     void setCaller( UPerfTest* callingTest ); // for internal use only
122     
123     void setPath( char* path ); // for internal use only
124     
125     ULine* getLines(UErrorCode& status);
126
127     const UChar* getBuffer(int32_t& len,UErrorCode& status);
128
129 protected:
130     UPerfTest(int32_t argc, const char* argv[], UErrorCode& status);
131
132     UPerfTest(int32_t argc, const char* argv[],
133               UOption addOptions[], int32_t addOptionsCount,
134               const char *addUsage,
135               UErrorCode& status);
136
137     void init(UOption addOptions[], int32_t addOptionsCount,
138               UErrorCode& status);
139
140     virtual UPerfFunction* runIndexedTest( int32_t index, UBool exec, const char* &name, char* par = NULL ); // overide !
141
142     virtual UBool runTestLoop( char* testname, char* par );
143
144     virtual UBool callTest( UPerfTest& testToBeCalled, char* par );
145
146     int32_t      _argc;
147     const char** _argv;
148     const char * _addUsage;
149     char*        resolvedFileName;
150     UCHARBUF*    ucharBuf;
151     const char*  encoding;
152     UBool        uselen;
153     const char*  fileName;
154     const char*  sourceDir;
155     int32_t      _remainingArgc;
156     ULine*       lines;
157     int32_t      numLines;
158     UBool        line_mode;
159     UChar* buffer;
160     int32_t      bufferLen;
161     UBool        verbose;
162     UBool        bulk_mode;
163     int32_t      passes;
164     int32_t      iterations;
165     int32_t      time;
166     const char*  locale;
167 private:
168     UPerfTest*   caller;
169     char*        path;           // specifies subtests
170
171 // static members
172 public:
173     static UPerfTest* gTest;
174     static const char gUsageString[];
175 };
176
177 #endif
178 #endif
179