Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: downloads/boost_1_34_1/libs/regex/test/regress/info.hpp @ 33

Last change on this file since 33 was 29, checked in by landauf, 17 years ago

updated boost from 1_33_1 to 1_34_1

File size: 5.5 KB
Line 
1/*
2 *
3 * Copyright (c) 2004
4 * John Maddock
5 *
6 * Use, modification and distribution are subject to the
7 * Boost Software License, Version 1.0. (See accompanying file
8 * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
9 *
10 */
11
12 /*
13  *   LOCATION:    see http://www.boost.org for most recent version.
14  *   FILE         info.hpp
15  *   VERSION      see <boost/version.hpp>
16  *   DESCRIPTION: Error handling for test cases.
17  */
18
19#ifndef BOOST_REGEX_REGRESS_INFO_HPP
20#define BOOST_REGEX_REGRESS_INFO_HPP
21#include <iostream>
22#include <string>
23#include <boost/regex.hpp>
24
25#ifdef TEST_THREADS
26#include <boost/thread/once.hpp>
27#include <boost/thread.hpp>
28#endif
29//
30// class test info,
31// store information about the test we are about to conduct:
32//
33template <class charT>
34class test_info_base
35{
36public:
37   typedef std::basic_string<charT> string_type;
38private:
39   struct data_type
40   {
41      std::string file;
42      int line;
43      string_type expression;
44      boost::regex_constants::syntax_option_type options;
45      string_type search_text;
46      boost::regex_constants::match_flag_type match_options;
47      const int* answer_table;
48      string_type format_string;
49      string_type result_string;
50      bool need_to_print;
51      std::string expression_type_name;
52   };
53#ifdef TEST_THREADS
54   static data_type& do_get_data()
55   {
56      static boost::thread_specific_ptr<data_type> pd;
57      if(pd.get() == 0)
58         pd.reset(new data_type());
59      return *(pd.get());
60   }
61   static void init_data()
62   {
63      do_get_data();
64   }
65#endif
66   static data_type& data()
67   {
68#ifdef TEST_THREADS
69      static boost::once_flag f = BOOST_ONCE_INIT;
70      boost::call_once(&init_data, f);
71      return do_get_data();
72#else
73      static data_type d;
74      return d;
75#endif
76   }
77public:
78   test_info_base(){};
79   static void set_info(
80      const char* file,
81      int line,
82      const string_type& ex,
83      boost::regex_constants::syntax_option_type opt,
84      const string_type& search_text = string_type(),
85      boost::regex_constants::match_flag_type match_options = boost::match_default,
86      const int* answer_table = 0,
87      const string_type& format_string = string_type(),
88      const string_type& result_string = string_type())
89   {
90      data_type& dat = data();
91      dat.file = file;
92      dat.line = line;
93      dat.expression = ex;
94      dat.options = opt;
95      dat.search_text = search_text;
96      dat.match_options = match_options;
97      dat.answer_table = answer_table;
98      dat.format_string = format_string;
99      dat.result_string = result_string;
100      dat.need_to_print = true;
101   }
102   static void set_typename(const std::string& n)
103   {
104      data().expression_type_name = n;
105   }
106
107   static const string_type& expression()
108   {
109      return data().expression;
110   }
111   static boost::regex_constants::syntax_option_type syntax_options()
112   {
113      return data().options;
114   }
115   static const string_type& search_text()
116   {
117      return data().search_text;
118   }
119   static boost::regex_constants::match_flag_type match_options()
120   {
121      return data().match_options;
122   }
123   static const int* answer_table()
124   {
125      return data().answer_table;
126   }
127   static const string_type& format_string()
128   {
129      return data().format_string;
130   }
131   static const string_type& result_string()
132   {
133      return data().result_string;
134   } 
135   static bool need_to_print()
136   {
137      return data().need_to_print;
138   }
139   static const std::string& file()
140   {
141      return data().file;
142   }
143   static int line()
144   {
145      return data().line;
146   }
147   static void clear()
148   {
149      data().need_to_print = false;
150   }
151   static std::string& expression_typename()
152   {
153      return data().expression_type_name;
154   }
155};
156
157template <class T>
158struct test_info
159   : public test_info_base<wchar_t>
160{};
161
162template<>
163struct test_info<char>
164   : public test_info_base<char>
165{};
166
167#if BOOST_WORKAROUND(__DECCXX_VER, BOOST_TESTED_AT(60590042))
168
169// Some template instantiation modes (namely local, implicit local, and weak) of
170// this compiler need an explicit instantiation because otherwise we end up with
171// multiple copies of the static variable defined in this method. This explicit
172// instantiation generates the static variable with common linkage, which makes
173// the linker choose only one of the available definitions. For more details,
174// see "man ld".
175
176template test_info_base<wchar_t>::data_type & test_info_base<wchar_t>::data();
177template test_info_base<char>::data_type & test_info_base<char>::data();
178
179#endif
180
181template <class charT>
182std::ostream& operator<<(std::ostream& os, const test_info<charT>&)
183{
184   if(test_info<charT>::need_to_print())
185   {
186      os << test_info<charT>::file() << ":" << test_info<charT>::line() << ": Error in test here:" << std::endl;
187      test_info<charT>::clear();
188   }
189   return os;
190}
191//
192// define some test macros:
193//
194extern int error_count;
195
196#define BOOST_REGEX_TEST_ERROR(msg, charT)\
197   ++error_count;\
198   std::cerr << test_info<charT>();\
199   std::cerr << "  " << __FILE__ << ":" << __LINE__ << ":" << msg \
200             << " (While testing " << test_info<charT>::expression_typename() << ")" << std::endl
201
202class errors_as_warnings
203{
204public:
205   errors_as_warnings()
206   {
207      m_saved_error_count = error_count;
208   }
209   ~errors_as_warnings()
210   {
211      if(m_saved_error_count != error_count)
212      {
213         std::cerr << "<note>The above " << (error_count - m_saved_error_count) << " errors are treated as warnings only.</note>" << std::endl;
214         error_count = m_saved_error_count;
215      }
216   }
217private:
218   int m_saved_error_count;
219};
220
221#endif
222
Note: See TracBrowser for help on using the repository browser.