|
Boost-Commit : |
From: john.groups_at_[hidden]
Date: 2008-01-12 11:28:05
Author: jtorjo
Date: 2008-01-12 11:28:04 EST (Sat, 12 Jan 2008)
New Revision: 42699
URL: http://svn.boost.org/trac/boost/changeset/42699
Log:
[logging]
v0.13.10, 12 jan 2008
- added test_rolling_file (tests rolling_file)
Added:
sandbox/logging/lib/logging/tests/test_rolling_file/test_rolling_file.sln (contents, props changed)
Removed:
sandbox/logging/lib/logging/tests/test_rolling_file/test.sln
Properties modified:
sandbox/logging/lib/logging/internal/vc8/loggingvc8/ (props changed)
sandbox/logging/lib/logging/tests/test_file/ (props changed)
sandbox/logging/lib/logging/tests/test_rolling_file/ (props changed)
Text files modified:
sandbox/logging/boost/logging/detail/raw_doc/changelog.hpp | 3
sandbox/logging/boost/logging/format/destination/rolling_file.hpp | 18 ++
sandbox/logging/lib/logging/internal/vc8/loggingvc8/loggingvc8.vcproj | 9 +
sandbox/logging/lib/logging/internal/vc8/loggingvc8/test_now.cpp | 104 ++++++++----------
sandbox/logging/lib/logging/tests/test_rolling_file/test.cpp | 218 +++++++++++++++++++++++++++++++++++++++
sandbox/logging/lib/logging/tests/test_rolling_file/test.vcproj | 6
6 files changed, 290 insertions(+), 68 deletions(-)
Modified: sandbox/logging/boost/logging/detail/raw_doc/changelog.hpp
==============================================================================
--- sandbox/logging/boost/logging/detail/raw_doc/changelog.hpp (original)
+++ sandbox/logging/boost/logging/detail/raw_doc/changelog.hpp 2008-01-12 11:28:04 EST (Sat, 12 Jan 2008)
@@ -1,7 +1,8 @@
/**
@page page_changelog Changelog
-_at_section changelog_cur_ver Current Version: v0.13.9, 11 jan 2008
+@section changelog_cur_ver Current Version: v0.13.10, 12 jan 2008
+- added test_rolling_file (tests rolling_file)
- solved bug - when used LOG_ in switch - thanks to Todd Neal!
- added test for formatter::file
- included <map> in destination::named - many thanks Jens Seidel!
Modified: sandbox/logging/boost/logging/format/destination/rolling_file.hpp
==============================================================================
--- sandbox/logging/boost/logging/format/destination/rolling_file.hpp (original)
+++ sandbox/logging/boost/logging/format/destination/rolling_file.hpp 2008-01-12 11:28:04 EST (Sat, 12 Jan 2008)
@@ -49,6 +49,7 @@
, initial_erase(this, false)
, start_where_size_not_exceeded(this, true)
, flush_each_time(this, false)
+ , extra_flags(this, std::ios_base::out)
{}
/// maximum size in bytes, by default 1Mb
@@ -63,6 +64,9 @@
/// if true, always flush after write (by default, false)
flag::t<bool> flush_each_time;
+
+ /// just in case you have some extra flags to pass, when opening each file
+ flag::t<std::ios_base::openmode> extra_flags;
};
namespace detail {
@@ -92,6 +96,9 @@
// file not found, we'll create it now
break;
+ if ( m_cur_idx >= m_flags.file_count())
+ // all files are too full (we'll overwrite the first one)
+ m_cur_idx = 0;
}
recreate_file();
@@ -99,17 +106,20 @@
std::string file_name(int idx) {
std::ostringstream out;
- out << m_name_prefix << "." << (idx+1);
+ if ( idx > 0)
+ out << m_name_prefix << "." << (idx+1);
+ else
+ out << m_name_prefix;
return out.str();
}
void recreate_file() {
m_out = boost::shared_ptr< std::basic_ofstream<char_type> >(new std::basic_ofstream<char_type>( file_name(m_cur_idx).c_str(),
- std::ios_base::out | std::ios_base::app));
- if ( m_out->tellp() > m_flags.max_size_bytes()) {
+ m_flags.extra_flags() | std::ios_base::out | std::ios_base::app));
+ if ( fs::file_size( file_name(m_cur_idx)) > m_flags.max_size_bytes()) {
// this file is already full - clear it first
m_out = boost::shared_ptr< std::basic_ofstream<char_type> >(new std::basic_ofstream<char_type>( file_name(m_cur_idx).c_str(),
- std::ios_base::out | std::ios_base::trunc));
+ m_flags.extra_flags() | std::ios_base::out | std::ios_base::trunc));
}
}
Modified: sandbox/logging/lib/logging/internal/vc8/loggingvc8/loggingvc8.vcproj
==============================================================================
--- sandbox/logging/lib/logging/internal/vc8/loggingvc8/loggingvc8.vcproj (original)
+++ sandbox/logging/lib/logging/internal/vc8/loggingvc8/loggingvc8.vcproj 2008-01-12 11:28:04 EST (Sat, 12 Jan 2008)
@@ -330,7 +330,6 @@
>
<FileConfiguration
Name="Test|Win32"
- ExcludedFromBuild="true"
>
<Tool
Name="VCCLCompilerTool"
@@ -792,6 +791,14 @@
<File
RelativePath="..\..\..\samples\scenarios\cache_before_init.cpp"
>
+ <FileConfiguration
+ Name="Test|Win32"
+ ExcludedFromBuild="true"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ />
+ </FileConfiguration>
</File>
<File
RelativePath="..\..\..\samples\scenarios\custom_fmt_dest.cpp"
Modified: sandbox/logging/lib/logging/internal/vc8/loggingvc8/test_now.cpp
==============================================================================
--- sandbox/logging/lib/logging/internal/vc8/loggingvc8/test_now.cpp (original)
+++ sandbox/logging/lib/logging/internal/vc8/loggingvc8/test_now.cpp 2008-01-12 11:28:04 EST (Sat, 12 Jan 2008)
@@ -1,103 +1,93 @@
/**
-_at_example using_tags.cpp
+@example one_loger_one_filter.cpp
-_at_copydoc using_tags
+@copydoc one_loger_one_filter
-_at_page using_tags using_tags.cpp Example
+@page one_loger_one_filter one_loger_one_filter.cpp Example
This usage:
-- You have one logger and one filter, which can be turned on or off
+- You have one logger
+- You have one filter, which can be turned on or off
- You want to format the message before it's written
- The logger has several log destinations
- - The output goes to console, and a file called out.txt
- - Formatting - message will look like this: <tt>[file/line] [thread_id] [idx] [time] message [enter] </tt>
+ - The output goes to console, debug output window, and a file called out.txt
+ - Formatting - prefix each message by its index, and append newline
Optimizations:
- use a cache string (from optimize namespace), in order to make formatting the message faster
In this example, all output will be written to the console, debug window, and "out.txt" file.
-The output can look like:
+It will be:
@code
-logging\samples\scenarios\using_tags.cpp:94 [T7204] [1] 14:55 this is so cool 1
-logging\samples\scenarios\using_tags.cpp:95 [T7204] [2] 14:55 this is so cool again 2
+[1] this is so cool 1
+[2] this is so cool again 2
+[3] hello, world
+[4] good to be back ;) 3
@endcode
*/
-
+#define BOOST_LOG_BEFORE_INIT_IGNORE_BEFORE_INIT
#include <boost/logging/format_fwd.hpp>
-#include <boost/logging/tags.hpp>
-#include <boost/logging/tag/high_precision_time.hpp>
// Step 1: Optimize : use a cache string, to make formatting the message faster
-namespace bl = boost::logging;
-typedef bl::tag::holder< bl::optimize::cache_string_one_str<>, bl::tag::file_line, bl::tag::thread_id, bl::tag::high_precision_time> log_string;
-BOOST_LOG_FORMAT_MSG( log_string )
-
+BOOST_LOG_FORMAT_MSG( optimize::cache_string_one_str<> )
-#include <boost/logging/format_ts.hpp>
-#include <boost/logging/format/formatter/tags.hpp>
-#include <boost/logging/format/formatter/named_spacer.hpp>
-#include <boost/logging/format/destination/named.hpp>
+#include <boost/logging/format.hpp>
+#include <boost/logging/writer/ts_write.hpp>
using namespace boost::logging;
// Step 3 : Specify your logging class(es)
-using namespace boost::logging::scenario::usage;
-typedef use<
- // the filter is always accurate (but slow)
- filter_::change::always_accurate,
- // filter does not use levels
- filter_::level::no_levels,
- // the logger is initialized once, when only one thread is running
- logger_::change::set_once_when_one_thread,
- // the logger favors speed (on a dedicated thread)
- logger_::favor::correctness> finder;
+typedef logger_format_write< > log_type;
+
// Step 4: declare which filters and loggers you'll use (usually in a header file)
-BOOST_DECLARE_LOG_FILTER(g_log_filter, finder::filter )
-BOOST_DECLARE_LOG(g_l, finder::logger)
+BOOST_DECLARE_LOG_FILTER(g_log_filter, filter::no_ts )
+BOOST_DECLARE_LOG(g_l, log_type)
// Step 5: define the macros through which you'll log
-#define L_ BOOST_LOG_USE_LOG_IF_FILTER(g_l, g_log_filter->is_enabled() ) .set_tag( BOOST_LOG_TAG_FILELINE)
+#define L_ BOOST_LOG_USE_LOG_IF_FILTER(g_l, g_log_filter->is_enabled() )
// Step 6: Define the filters and loggers you'll use (usually in a source file)
-BOOST_DEFINE_LOG_FILTER(g_log_filter, finder::filter )
-BOOST_DEFINE_LOG(g_l, finder::logger)
+BOOST_DEFINE_LOG_FILTER(g_log_filter, filter::no_ts )
+BOOST_DEFINE_LOG(g_l, log_type)
+void f () {
+ BOOST_SCOPED_LOG_CTX(L_);// << "execution_pool::executor_defer_func(...)";
+ L_ << "Executing component ";
+}
-void using_tags_example() {
+void one_logger_one_filter_example() {
// Step 7: add formatters and destinations
// That is, how the message is to be formatted and where should it be written to
- g_l->writer().add_formatter( formatter::named_spacer( "%fileline% [T%thread_id%] [%idx%] %time%" )
- .add( "time", formatter::tag::high_precision_time("$hh:$mm:$ss.$mili ") ) // time tag
- .add( "idx", formatter::idx() )
- .add( "thread_id", formatter::tag::thread_id() ) // thread_id tag
- .add( "fileline", formatter::tag::file_line() ) ); // file/line tag
-
- g_l->writer().add_formatter( formatter::append_newline() );
-
- g_l->writer().add_destination(
- destination::named("+cout out -debug")
- .add( "cout", destination::cout())
- .add( "debug", destination::dbg_window() )
- .add( "out", destination::file("out.txt"))
- );
+ g_l->writer().add_formatter( formatter::idx(), "[%] " );
+ g_l->writer().add_formatter( formatter::append_newline_if_needed() );
+ g_l->writer().add_destination( destination::file("out.txt") );
+ g_l->writer().add_destination( destination::cout() );
+ g_l->writer().add_destination( destination::dbg_window() );
+
g_l->turn_cache_off();
// Step 8: use it...
int i = 1;
-
- switch ( i) {
- case 0:L_ << "this is so cool " << i++; break;
- case 1:L_ << "this is so cool " << i++; break;
- }
L_ << "this is so cool " << i++;
- // L_ << "this is so cool again " << i++;
+ L_ << "this is so cool again " << i++;
+
+ std::string hello = "hello", world = "world";
+ L_ << hello << ", " << world;
+
+ g_log_filter->set_enabled(false);
+ L_ << "this will not be written to the log";
+ L_ << "this won't be written to the log";
+
+ g_log_filter->set_enabled(true);
+ L_ << "good to be back ;) " << i++;
+
// Step 9 : Enjoy!
}
@@ -105,7 +95,7 @@
int main() {
- using_tags_example();
+ one_logger_one_filter_example();
}
Modified: sandbox/logging/lib/logging/tests/test_rolling_file/test.cpp
==============================================================================
--- sandbox/logging/lib/logging/tests/test_rolling_file/test.cpp (original)
+++ sandbox/logging/lib/logging/tests/test_rolling_file/test.cpp 2008-01-12 11:28:04 EST (Sat, 12 Jan 2008)
@@ -1,13 +1,227 @@
/*
Tests rolling file
+ - tests writing to a clean rolling file
+ - tests writing to a rolling file that has been partially written to
+ - tests writing to a rolling file that is full (that is, all its files are fully written to)
+ thus, we should start writing from the first file
*/
-#include <boost/logging/logging.hpp>
+#include <boost/logging/format.hpp>
+#include <boost/logging/writer/ts_write.hpp>
+#include <boost/logging/format/destination/rolling_file.hpp>
+
+#include <boost/filesystem/path.hpp>
+#include <boost/filesystem/operations.hpp>
+#include <boost/filesystem/convenience.hpp>
+namespace fs = boost::filesystem;
+
+using namespace boost::logging;
+
+typedef logger_format_write< > log_type;
+
+BOOST_DEFINE_LOG_FILTER(g_log_filter, filter::no_ts )
+BOOST_DEFINE_LOG(g_l, log_type)
+
+#define L_ BOOST_LOG_USE_LOG_IF_FILTER(g_l, g_log_filter->is_enabled() )
+
+// whatever we log to the rolling file, we log here too (easy was to find out all the info that was logged)
+std::stringstream g_stringstream;
+
+// keeps all we log to the rolling file, after all its files are full
+std::stringstream g_after_full;
+
+// when emulating writing to a log file - each block is the equivalent of a file from the rolling file
+std::vector<std::string> g_blocks;
+
+const int MAX_SIZE_PER_FILE = 1024 + 512;
+const int FILE_COUNT = 5;
+
+const char NEXT_LINE = '\n';
+
+void init_logs() {
+ g_l->writer().add_destination(
+ destination::rolling_file("out.txt",
+ destination::rolling_file_settings()
+ .initial_erase(true)
+ .max_size_bytes( MAX_SIZE_PER_FILE)
+ .file_count( FILE_COUNT)
+ .flush_each_time(true)
+ .extra_flags(std::ios_base::binary)
+ ));
+ g_l->writer().add_formatter( formatter::idx(), "[%] " );
+ g_l->writer().add_destination( destination::stream(g_stringstream) );
+ g_l->writer().add_destination( destination::cout() );
+ g_l->turn_cache_off();
+}
+
+void write_to_clean_rolling_file() {
+ // read this .cpp file - every other line is logged (odd lines)
+ std::ifstream in("test.cpp");
+ bool enabled = true;
+ std::string line;
+ while ( std::getline(in, line) ) {
+ g_log_filter->set_enabled(enabled);
+ L_ << "line odd " << line << NEXT_LINE;
+ enabled = !enabled;
+ }
+ g_log_filter->set_enabled(true);
+}
+
+void write_to_existing_rolling_file() {
+ g_l->writer().del_destination( destination::rolling_file("out.txt") );
+ g_l->writer().add_destination(
+ destination::rolling_file("out.txt",
+ destination::rolling_file_settings()
+ .initial_erase(false)
+ .max_size_bytes( MAX_SIZE_PER_FILE)
+ .file_count( FILE_COUNT)
+ .flush_each_time(true)
+ .extra_flags(std::ios_base::binary)
+ ));
+
+ // read this .cpp file - every other line is logged (even lines now)
+ std::ifstream in("test.cpp");
+ bool enabled = false;
+ std::string line;
+ while ( std::getline(in, line) ) {
+ g_log_filter->set_enabled(enabled);
+ L_ << "line even " << line << NEXT_LINE;
+ enabled = !enabled;
+ }
+ g_log_filter->set_enabled(true);
+}
+
+// a bit of white-box testing - we need to know the file names - when dealing with a rolling file
+std::string file_name(const std::string & name_prefix, int idx) {
+ std::ostringstream out;
+ if ( idx > 0)
+ out << name_prefix << "." << (idx+1);
+ else
+ out << name_prefix;
+ return out.str();
+}
+
+void test_contents() {
+ // now, read each file and see if it matches the blocks
+ for ( int idx = 0; idx < FILE_COUNT; ++idx) {
+ std::ifstream cur_file( file_name("out.txt", idx).c_str() , std::ios_base::in | std::ios_base::binary );
+ std::ostringstream out;
+ out << cur_file.rdbuf();
+ std::string cur_file_contents = out.str();
+ std::string & cur_block = g_blocks[idx];
+ BOOST_ASSERT( cur_file_contents == cur_block);
+ }
+}
+
+void test_contents_after_write_to_existing_rolling_file() {
+ //
+ // at this point, we've rolled over - that is, some of the very old contents have been overwritten
+
+ // we've also written to a stream, to get the contents as they would have been written, if we hadn't rolled over
+ std::string all_contents = g_stringstream.str();
+ std::istringstream in(all_contents);
+
+ // now, we emulate writing to a rolled file - but we do it in memory
+ g_blocks.resize( FILE_COUNT);
+ int cur_block = 0;
+
+ std::string line;
+ while ( std::getline(in, line, NEXT_LINE) ) {
+ g_blocks[cur_block] += line + NEXT_LINE;
+
+ if ( g_blocks[cur_block].size() > MAX_SIZE_PER_FILE) {
+ cur_block = (cur_block + 1) % FILE_COUNT;
+ if ( g_blocks[cur_block].size() > MAX_SIZE_PER_FILE)
+ // we've rolled to a new file - clear it first
+ g_blocks[cur_block].clear();
+ }
+ }
+
+ // now, read each file and see if it matches the blocks
+ for ( int idx = 0; idx < FILE_COUNT; ++idx) {
+ std::ifstream cur_file( file_name("out.txt", idx).c_str() , std::ios_base::in | std::ios_base::binary );
+ std::ostringstream out;
+ out << cur_file.rdbuf();
+ std::string cur_file_contents = out.str();
+ std::string & cur_block = g_blocks[idx];
+ BOOST_ASSERT( cur_file_contents == cur_block);
+ }
+}
+
+void write_to_too_full_rolling_file() {
+ // make sure all files are too full to be appended to
+ for ( int idx = 0; idx < FILE_COUNT; ++idx) {
+ std::string cur_file_name = file_name("out.txt", idx);
+ std::ofstream cur_file( cur_file_name.c_str() , std::ios_base::out | std::ios_base::app | std::ios_base::binary );
+ int file_size = (int)fs::file_size( cur_file_name);
+ if ( file_size < MAX_SIZE_PER_FILE) {
+ std::string dummy(MAX_SIZE_PER_FILE, ' ');
+ g_blocks[idx] += dummy;
+ cur_file.write( dummy.c_str(), (std::streamsize)dummy.size() );
+ }
+ }
+
+ // right now, we know for sure that all files are too big - thus, when logging, we should end up writing to first file first
+ g_l->writer().del_destination( destination::rolling_file("out.txt") );
+ g_l->writer().add_destination(
+ destination::rolling_file("out.txt",
+ destination::rolling_file_settings()
+ .initial_erase(false)
+ .max_size_bytes( MAX_SIZE_PER_FILE)
+ .file_count( FILE_COUNT)
+ .flush_each_time(true)
+ .extra_flags(std::ios_base::binary)
+ ));
+ // remember what's written starting now
+ g_l->writer().add_destination( destination::stream(g_after_full) );
+
+ //
+ // and right now, do some logging
+
+ // read this .cpp file - every Xth line is written
+ const int LINE_PERIOD = 6;
+ std::ifstream in("test.cpp");
+ int line_idx = 0;
+ std::string line;
+ while ( std::getline(in, line) ) {
+ if ( (line_idx % LINE_PERIOD) == 0)
+ L_ << "new line " << line << NEXT_LINE;
+ ++line_idx;
+ }
+
+}
+void test_contents_after_writing_to_full_rolling_file() {
+ std::string last_contents = g_after_full.str();
+ std::istringstream in(last_contents);
+
+ // emulate writing to the rolling file, knowing that we should start writing to the first file from the rolling file
+ int cur_block = 0;
+ // first time we write, we clear the first file
+ g_blocks[0].clear();
+
+ std::string line;
+ while ( std::getline(in, line, NEXT_LINE) ) {
+ g_blocks[cur_block] += line + NEXT_LINE;
+
+ if ( g_blocks[cur_block].size() > MAX_SIZE_PER_FILE) {
+ cur_block = (cur_block + 1) % FILE_COUNT;
+ if ( g_blocks[cur_block].size() > MAX_SIZE_PER_FILE)
+ // we've rolled to a new file - clear it first
+ g_blocks[cur_block].clear();
+ }
+ }
+
+ test_contents();
+}
+
int main() {
+ fs::path::default_name_check( fs::no_check);
+
+ init_logs();
write_to_clean_rolling_file();
write_to_existing_rolling_file();
- test_contents();
+ test_contents_after_write_to_existing_rolling_file();
write_to_too_full_rolling_file();
test_contents_after_writing_to_full_rolling_file();
}
Deleted: sandbox/logging/lib/logging/tests/test_rolling_file/test.sln
==============================================================================
--- sandbox/logging/lib/logging/tests/test_rolling_file/test.sln 2008-01-12 11:28:04 EST (Sat, 12 Jan 2008)
+++ (empty file)
@@ -1,20 +0,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 9.00
-# Visual Studio 2005
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test", "test.vcproj", "{C5897099-5FA2-4E12-AFFC-2015364347FA}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Win32 = Debug|Win32
- Release|Win32 = Release|Win32
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {C5897099-5FA2-4E12-AFFC-2015364347FA}.Debug|Win32.ActiveCfg = Debug|Win32
- {C5897099-5FA2-4E12-AFFC-2015364347FA}.Debug|Win32.Build.0 = Debug|Win32
- {C5897099-5FA2-4E12-AFFC-2015364347FA}.Release|Win32.ActiveCfg = Release|Win32
- {C5897099-5FA2-4E12-AFFC-2015364347FA}.Release|Win32.Build.0 = Release|Win32
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
Modified: sandbox/logging/lib/logging/tests/test_rolling_file/test.vcproj
==============================================================================
--- sandbox/logging/lib/logging/tests/test_rolling_file/test.vcproj (original)
+++ sandbox/logging/lib/logging/tests/test_rolling_file/test.vcproj 2008-01-12 11:28:04 EST (Sat, 12 Jan 2008)
@@ -2,7 +2,7 @@
<VisualStudioProject
ProjectType="Visual C++"
Version="8.00"
- Name="test"
+ Name="test_rolling_file"
ProjectGUID="{C5897099-5FA2-4E12-AFFC-2015364347FA}"
RootNamespace="test"
Keyword="Win32Proj"
@@ -20,7 +20,7 @@
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
- CharacterSet="1"
+ CharacterSet="2"
>
<Tool
Name="VCPreBuildEventTool"
@@ -62,7 +62,7 @@
<Tool
Name="VCLinkerTool"
LinkIncremental="2"
- AdditionalLibraryDirectories="D:\boosts\boost_1_33_1\bin\boost\libs\thread\build\libboost_thread.lib\vc-8_0\debug\threading-multi"
+ AdditionalLibraryDirectories="D:\boosts\boost_1_33_1\bin\boost\libs\thread\build\libboost_thread.lib\vc-8_0\debug\threading-multi;D:\boosts\boost_1_33_1\bin\boost\libs\filesystem\build\libboost_filesystem.lib\vc-8_0\debug\threading-multi"
GenerateDebugInformation="true"
SubSystem="1"
TargetMachine="1"
Added: sandbox/logging/lib/logging/tests/test_rolling_file/test_rolling_file.sln
==============================================================================
--- (empty file)
+++ sandbox/logging/lib/logging/tests/test_rolling_file/test_rolling_file.sln 2008-01-12 11:28:04 EST (Sat, 12 Jan 2008)
@@ -0,0 +1,20 @@
+
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual Studio 2005
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test", "test.vcproj", "{C5897099-5FA2-4E12-AFFC-2015364347FA}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Release|Win32 = Release|Win32
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {C5897099-5FA2-4E12-AFFC-2015364347FA}.Debug|Win32.ActiveCfg = Debug|Win32
+ {C5897099-5FA2-4E12-AFFC-2015364347FA}.Debug|Win32.Build.0 = Debug|Win32
+ {C5897099-5FA2-4E12-AFFC-2015364347FA}.Release|Win32.ActiveCfg = Release|Win32
+ {C5897099-5FA2-4E12-AFFC-2015364347FA}.Release|Win32.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk