151 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			151 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| // Copyright 2003 and onwards Google Inc.
 | |
| // Author: Sanjay Ghemawat
 | |
| 
 | |
| #ifdef HAVE_CONFIG_H
 | |
| #include "config.h"
 | |
| #endif
 | |
| 
 | |
| #include <stdio.h>
 | |
| #include <map>
 | |
| #include <algorithm>    // for make_pair
 | |
| 
 | |
| #include "pcrecpp.h"
 | |
| #include "pcre_stringpiece.h"
 | |
| 
 | |
| // CHECK dies with a fatal error if condition is not true.  It is *not*
 | |
| // controlled by NDEBUG, so the check will be executed regardless of
 | |
| // compilation mode.  Therefore, it is safe to do things like:
 | |
| //    CHECK(fp->Write(x) == 4)
 | |
| #define CHECK(condition) do {                           \
 | |
|   if (!(condition)) {                                   \
 | |
|     fprintf(stderr, "%s:%d: Check failed: %s\n",        \
 | |
|             __FILE__, __LINE__, #condition);            \
 | |
|     exit(1);                                            \
 | |
|   }                                                     \
 | |
| } while (0)
 | |
| 
 | |
| using pcrecpp::StringPiece;
 | |
| 
 | |
| static void CheckSTLComparator() {
 | |
|   string s1("foo");
 | |
|   string s2("bar");
 | |
|   string s3("baz");
 | |
| 
 | |
|   StringPiece p1(s1);
 | |
|   StringPiece p2(s2);
 | |
|   StringPiece p3(s3);
 | |
| 
 | |
|   typedef std::map<StringPiece, int> TestMap;
 | |
|   TestMap map;
 | |
| 
 | |
|   map.insert(std::make_pair(p1, 0));
 | |
|   map.insert(std::make_pair(p2, 1));
 | |
|   map.insert(std::make_pair(p3, 2));
 | |
| 
 | |
|   CHECK(map.size() == 3);
 | |
| 
 | |
|   TestMap::const_iterator iter = map.begin();
 | |
|   CHECK(iter->second == 1);
 | |
|   ++iter;
 | |
|   CHECK(iter->second == 2);
 | |
|   ++iter;
 | |
|   CHECK(iter->second == 0);
 | |
|   ++iter;
 | |
|   CHECK(iter == map.end());
 | |
| 
 | |
|   TestMap::iterator new_iter = map.find("zot");
 | |
|   CHECK(new_iter == map.end());
 | |
| 
 | |
|   new_iter = map.find("bar");
 | |
|   CHECK(new_iter != map.end());
 | |
| 
 | |
|   map.erase(new_iter);
 | |
|   CHECK(map.size() == 2);
 | |
| 
 | |
|   iter = map.begin();
 | |
|   CHECK(iter->second == 2);
 | |
|   ++iter;
 | |
|   CHECK(iter->second == 0);
 | |
|   ++iter;
 | |
|   CHECK(iter == map.end());
 | |
| }
 | |
| 
 | |
| static void CheckComparisonOperators() {
 | |
| #define CMP_Y(op, x, y)                                         \
 | |
|   CHECK( (StringPiece((x)) op StringPiece((y))));               \
 | |
|   CHECK( (StringPiece((x)).compare(StringPiece((y))) op 0))
 | |
| 
 | |
| #define CMP_N(op, x, y)                                         \
 | |
|   CHECK(!(StringPiece((x)) op StringPiece((y))));               \
 | |
|   CHECK(!(StringPiece((x)).compare(StringPiece((y))) op 0))
 | |
| 
 | |
|   CMP_Y(==, "",   "");
 | |
|   CMP_Y(==, "a",  "a");
 | |
|   CMP_Y(==, "aa", "aa");
 | |
|   CMP_N(==, "a",  "");
 | |
|   CMP_N(==, "",   "a");
 | |
|   CMP_N(==, "a",  "b");
 | |
|   CMP_N(==, "a",  "aa");
 | |
|   CMP_N(==, "aa", "a");
 | |
| 
 | |
|   CMP_N(!=, "",   "");
 | |
|   CMP_N(!=, "a",  "a");
 | |
|   CMP_N(!=, "aa", "aa");
 | |
|   CMP_Y(!=, "a",  "");
 | |
|   CMP_Y(!=, "",   "a");
 | |
|   CMP_Y(!=, "a",  "b");
 | |
|   CMP_Y(!=, "a",  "aa");
 | |
|   CMP_Y(!=, "aa", "a");
 | |
| 
 | |
|   CMP_Y(<, "a",  "b");
 | |
|   CMP_Y(<, "a",  "aa");
 | |
|   CMP_Y(<, "aa", "b");
 | |
|   CMP_Y(<, "aa", "bb");
 | |
|   CMP_N(<, "a",  "a");
 | |
|   CMP_N(<, "b",  "a");
 | |
|   CMP_N(<, "aa", "a");
 | |
|   CMP_N(<, "b",  "aa");
 | |
|   CMP_N(<, "bb", "aa");
 | |
| 
 | |
|   CMP_Y(<=, "a",  "a");
 | |
|   CMP_Y(<=, "a",  "b");
 | |
|   CMP_Y(<=, "a",  "aa");
 | |
|   CMP_Y(<=, "aa", "b");
 | |
|   CMP_Y(<=, "aa", "bb");
 | |
|   CMP_N(<=, "b",  "a");
 | |
|   CMP_N(<=, "aa", "a");
 | |
|   CMP_N(<=, "b",  "aa");
 | |
|   CMP_N(<=, "bb", "aa");
 | |
| 
 | |
|   CMP_N(>=, "a",  "b");
 | |
|   CMP_N(>=, "a",  "aa");
 | |
|   CMP_N(>=, "aa", "b");
 | |
|   CMP_N(>=, "aa", "bb");
 | |
|   CMP_Y(>=, "a",  "a");
 | |
|   CMP_Y(>=, "b",  "a");
 | |
|   CMP_Y(>=, "aa", "a");
 | |
|   CMP_Y(>=, "b",  "aa");
 | |
|   CMP_Y(>=, "bb", "aa");
 | |
| 
 | |
|   CMP_N(>, "a",  "a");
 | |
|   CMP_N(>, "a",  "b");
 | |
|   CMP_N(>, "a",  "aa");
 | |
|   CMP_N(>, "aa", "b");
 | |
|   CMP_N(>, "aa", "bb");
 | |
|   CMP_Y(>, "b",  "a");
 | |
|   CMP_Y(>, "aa", "a");
 | |
|   CMP_Y(>, "b",  "aa");
 | |
|   CMP_Y(>, "bb", "aa");
 | |
| 
 | |
| #undef CMP_Y
 | |
| #undef CMP_N
 | |
| }
 | |
| 
 | |
| int main(int argc, char** argv) {
 | |
|   CheckComparisonOperators();
 | |
|   CheckSTLComparator();
 | |
| 
 | |
|   printf("OK\n");
 | |
|   return 0;
 | |
| }
 |