The October 2013 issue of Overload includes an article by Steve Love on building a range library that enables LINQ like syntax in C++.
This looks pretty good and is along similar lines to the approach in cpplinq.
The October 2013 issue of Overload includes an article by Steve Love on building a range library that enables LINQ like syntax in C++.
This looks pretty good and is along similar lines to the approach in cpplinq.
Filed under C++, Programming
Short interview with Bjarne Stroustrup where he comments briefly on Go and Swift.
Apparently, Stroustrup is currently working for Morgan Stanley – hence his interest in C++ for financial applications.
Filed under C++, Programming
One of the many features provided by GTest is the ability to generate test at runtime. One useful application of this is that you can execute data-driven testing by obtaining a list of test file names, then generating a test for each of them. It’s actually very simple to do this in GTest – they call these value-parameterized tests (see documentation). Here’s a snippet of code to demonstrate how little overhead is involved:
#include <gtest/gtest.h>
using namespace testing;
// placeholder - could be used for test setup/cleanup
class MyTest : public ::testing::TestWithParam<std::string>
{
};
TEST_P( MyTest, IntegrationTest )
{
std::string test_file_name = GetParam();
// open file and run the integration test
}
std::vector<std::string> test_file_names();
INSTANTIATE_TEST_CASE_P( MyLibraryName, MyTest, test::ValuesIn( test_file_names() ) );
On one hand, this approach isn’t really in the spirit of unit test – data-driven tests have a habit of quickly escalating to integration tests between libraries. However, such integration tests also have their place in a testing strategy, and this is a neat way to accomplish it with minimal overhead.
Filed under C++, C++ Code, Programming
As per my earlier post How to transform between a double date-time and std::string in C++, some things are surprisingly hard in C++, especially compared to writing in a .NET language. I recently tracked down this useful snippet of code on the internet in order to recursively build a list of files matching some file extension under a folder. This only compiles on Windows – if you want something cross-platform, look at boost (I wanted to avoid bringing the boost filesystem library into my project as yet another dependency).
void accumulate_files(
const std::string& folder,
const std::string& extension,
std::vector<std::string>& file_names )
{
std::ostringstream oss;
oss << folder << "\\";
std::string search_path = oss.str();
WIN32_FIND_DATA fd;
HANDLE hFind = ::FindFirstFile( search_path.c_str(), &fd );
if( hFind != INVALID_HANDLE_VALUE)
{
do
{
std::string file_name = fd.cFileName;
std::ostringstream full_file_name;
full_file_name << folder << "\\" << file_name;
if ( boost::algorithm::ends_with( file_name, extension ) )
{
file_names.push_back( file_name );
}
else if ( file_name != "." && file_name != ".." && !file_name.empty() )
{
// Recursively call into next directory
accumulate_files( full_file_name.c_str(), extension, file_names );
}
}
while( ::FindNextFile(hFind, &fd) );
::FindClose(hFind);
}
}
For production code, you’d also want to wrap the file handle in a smart pointer to ensure it gets closed properly for exception safety.
Filed under C++, C++ Code, Programming
I’ve just tried out CppLinq, a C++11 library that brings LINQ-style syntax into scope for C++ programmers that are used to writing code in a functional style. I’ve been using C++11 lambdas with STL algorithms like foreach, transform, accumulate – but this syntax using where, for_each, sum and ‘>>’ to chain commands together is so much neater. In fact, it brings C++11 style very close to the succinct F# piping style that is so popular.
To use cpplinq, you can just download a single header file and include it in your code. Awesome – having just battled for hours to use some other 3rd party library which required multiple libs, source files and compiler switches, this is so easy by comparison.
This Dr Dobbs article has several code examples which act as an simple tutorial.
Filed under C++, Programming
One of many neat features in C++11 is the introduction of ‘enum class’ – this addresses problems arising from enum declarations such as scoping (the enum cases leak in the same scope as the enum type) and implicit conversion to integer. See Stroustrup’s C++11 FAQ for more details.
However, in the papers that motivated the new language feature (N1513 and N2347) they discuss the current workarounds for C++03. One such workaround is to define a class to represent the enum type – it’s much more verbose than the new C++11 feature, but it solves the scoping and conversion issues.
// Header file
class Weekday
{
private:
// Note that the private enum cases have underscores to differentiate
// from the public cases
typedef enum Weekday_ { Mon_, Tues_, Wed_, Thurs_, Fri_, Sat_, Sun_ };
Weekday_ value_;
public:
static const Weekday Mon, Tues, Wed, Thurs, Fri, Sat, Sun;
explicit Weekday( const Weekday_& value ) : value_( value ){}
bool operator<( const Weekday& rhs ) const { return this->value_ < rhs.value_; }
bool operator==( const Weekday& rhs ) const { return this->value_ == rhs.value_; }
bool operator!=( const Weekday& rhs ) const { return !(this->operator==(rhs)); }
};
// Source file
// Definitions for the public Weekday instances
// in terms of the private enum
const Weekday Weekday::Mon( Mon_ );
const Weekday Weekday::Tues( Tues_ );
const Weekday Weekday::Wed( Wed_ );
const Weekday Weekday::Thurs( Thurs_ );
const Weekday Weekday::Fri( Fri_ );
const Weekday Weekday::Sat( Sat_ );
const Weekday Weekday::Sun( Sun_ );
That’s it – I’ve been using this recently and it works pretty well. I also added a “to_int()” member and a static “from_int()” member to explicitly convert bewteen the enum class and integers – the implementation is simply a switch over the enum cases.
Filed under C++, C++ Code, Programming
One of the attractions of writing software using the .NET framework is the wealth of support for doing simple things like translating between different data formats. These tasks are typically much harder to achieve in C++ due to the lack of an equivalent framework. One such task that I came across the other day is that date-times are often represented by a double in Windows, where the integer part represents the date since some epoch and the fractional part is the time as a fraction of 24 hours. Even with access to the Boost library, I still had to do some work to produce a simple transformation in C++.
#include <boost/format.hpp>
#include <boost/date_time/gregorian/gregorian.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
typedef double DateTime;
namespace
{
boost::gregorian::date parse_date( DateTime date_time )
{
boost::gregorian::date dt = boost::date_time::parse_date<boost::gregorian::date>( "1899-12-30", boost::date_time::ymd_order_iso );
dt += boost::gregorian::date_duration( static_cast<long>( floor(date_time) ) );
}
boost::posix_time::time_duration parse_time( DateTime date_time )
{
double fractionalDay = date_time - floor(date_time);
long milliseconds = static_cast<long>( floor( fractionalDay * 24.0 * 60.0 * 60.0 * 1000.0 + 0.5) );
return boost::posix_time::milliseconds( milliseconds );
}
}
std::string to_date_string( DateTime date_time )
{
boost::gregorian::date dt = parse_date( date_time );
return (boost::format( "%4-%02d-%02d" ) % dt.year() % dt.month().as_number() % dt.day().as_number()).str();
}
DateTime from_date_string( const std::string& value )
{
boost::gregorian::date epoch = boost::date_time::parse_date<boost::gregorian::date>( "1899-12-30", boost::date_time::ymd_order_iso);
boost::gregorian::date dt = boost::date_time::parse_date<boost::gregorian::date>( value, boost::date_time::ymd_order_iso);
boost::gregorian::date_duration diff = dt - epoch;
return diff.days();
}
std::string to_date_time_string( DateTime date_time )
{
boost::gregorian::date date_part = parse_date( date_time );
boost::posix_time::time_duration time_part = parse_time( date_time );
long long fractional_seconds = time_part.fractional_seconds();
boost::date_time::time_resolutions resolution = time_part.resolution();
if ( resolution == boost::date_time::micro )
{
fractional_seconds /= 1000;
}
else
{
if (resolution != boost::date_time::milli)
throw std::logic_error( "Unexpected time resolution" );
}
return (boost::format( "%d-%02d-%02d %02d:%02d:%02d.%03d" )
% date_part.Year() % date_part.month().as_number() % date_part.day().as_number()
% time_part.hours() % time_part.minutes() % time_part.seconds() % fractional_seconds ).str();
}
DateTime from_date_time_string( const std::string& value )
{
DateTime date = from_date_string( value );
boost::posix_time::ptime t = boost::posix_time::time_from_string( value );
double milliseconds = static_cast<double>(t.time_of_day().total_milliseconds());
return date + (milliseconds / 24.0 / 60.0 / 60.0 / 1000.0);
}
Please comment if you know a more straight-forward way to achieve this transformation, especially using Boost. Syntactically, the code could be simplified using C++11 auto, but I’ve spelt out the types explicitly throughout because I found it helpful to see which parts of the boost library are being used.
Filed under C++, C++ Code, Programming
This C++ quiz is quite fun – not all of the questions require C++ 11, but some do.
Filed under C++, Programming
This presentation from Stephan Lavavej could have been entitled “Compiler Knows Best” – he rockets through numerous examples where the advice is to write less code and let the compiler do the right thing.
Here’s a slide of one of the key messages:
Other highlights for me:
I love the new features of C++11 and couldn’t have written some of the cool libraries I’m working on without them. But – presentations like this make me concerned for the complexity of the language and the steep learning curve that even experienced C++ hires will have to climb.
Filed under C++, Programming, Video
Interesting question on StackOverflow – Why does unique_ptr take two template parameters when shared_ptr only takes one?
I haven’t used std::unique_ptr much and wasn’t aware that you could supply a custom deletor.
If you provide the deleter as template argument (as in unique_ptr) it is part of the type and you don’t need to store anything additional in the objects of this type. If deleter is passed as constructor’s argument (as in shared_ptr) you need to store it in the object. This is the cost of additional flexibility, since you can use different deleters for the objects of the same type
Since unique_ptr is lightweight and doesn’t have the overhead of a control block, it uses a template parameter for the deletor. std::shared_ptr takes the other choice since it already has a control block and gains the extra flexibility.
Filed under C++, Programming