// (C) Copyright 2010 Just Software Solutions Ltd http://www.justsoftwaresolutions.co.uk // (C) Copyright 2012 Vicente Botet // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #define BOOST_THREAD_VERSION 4 #include <iostream> #include <string> #include <boost/thread/synchronized_value.hpp> void addTrailingSlashIfMissing(boost::synchronized_value<std::string> & path) { boost::strict_lock_ptr<std::string> u=path.synchronize(); if(u->empty() || (*u->rbegin()!='/')) { *u+='/'; } } void f(const boost::synchronized_value<int> &v) { std::cout<<"v="<<*v<<std::endl; } void g(const boost::const_strict_lock_ptr<int> &v) { std::cout<<"v="<<*v<<std::endl; } bool checkIfMissingTrailingSlash(boost::synchronized_value<std::string> & path) { boost::strict_lock_ptr<std::string> u=path.synchronize(); return (u->empty() || (*u->rbegin()!='/')); } int main() { { boost::synchronized_value<int> v1; *v1=42; std::cout<<"v1="<<*v1<<std::endl; f(v1); int i=*v1; std::cout<<"i="<<i<<std::endl; { boost::strict_lock_ptr<int> u=v1.synchronize(); *u+=43; std::cout<<"v1="<<*u<<std::endl; g(u); } boost::synchronized_value<int> v2(2); std::cout<<"v2="<<*v2<<std::endl; v2 = 3; std::cout<<"v2="<<*v2<<std::endl; boost::synchronized_value<int> v3(v2); std::cout<<"v3="<<*v3<<std::endl; v3 = v1; std::cout<<"v3="<<*v3<<std::endl; std::cout<<"v2="<<*v3<<std::endl; std::cout<<"v3="<<*v3<<std::endl; swap(v3,v2); v1.swap(v2); std::cout<<"v3="<<*v3<<std::endl; } { boost::synchronized_value<std::string> s; addTrailingSlashIfMissing(s); std::cout<<"s="<<std::string(*s)<<std::endl; } { boost::synchronized_value<std::string> s; s->append("foo/"); s.synchronize()->append("foo"); addTrailingSlashIfMissing(s); std::cout<<"s="<<std::string(*s)<<std::endl; } { boost::synchronized_value<std::string> s; s = std::string("foo/"); std::cout<<"ss="<< s << std::endl; } { boost::synchronized_value<std::string> s; s = "foo/"; std::cout<<"ss="<< s << std::endl; } { boost::synchronized_value<std::string> s1("a"); boost::synchronized_value<std::string> s2; s2=s1; std::cout<<"s1="<< s1 << std::endl; std::cout<<"s2="<< s2 << std::endl; } { boost::synchronized_value<std::string> s1("a"); boost::synchronized_value<std::string> s2("b"); std::cout<<"s1="<< s1 << std::endl; std::cout<<"s2="<< s2 << std::endl; swap(s1,s2); std::cout<<"s1="<< s1 << std::endl; std::cout<<"s2="<< s2 << std::endl; } #if ! defined(BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS) { boost::synchronized_value<std::string> sts("a"); std::string s(sts); std::cout<<"ssts="<< s << std::endl; } #endif { boost::synchronized_value<int> s1(1); boost::synchronized_value<int> s2(1); BOOST_ASSERT(s1==s2); BOOST_ASSERT(s1<=s2); BOOST_ASSERT(s1>=s2); BOOST_ASSERT(s1==1); BOOST_ASSERT(s1<=1); BOOST_ASSERT(s1>=1); } { boost::synchronized_value<int> s1(1); boost::synchronized_value<int> s2(2); BOOST_ASSERT(s1!=s2); BOOST_ASSERT(s1!=2); BOOST_ASSERT(2!=s1); } { boost::synchronized_value<int> s1(1); boost::synchronized_value<int> s2(2); BOOST_ASSERT(s1<s2); BOOST_ASSERT(s1<=s2); BOOST_ASSERT(s2>s1); BOOST_ASSERT(s2>=s1); BOOST_ASSERT(s1<2); BOOST_ASSERT(s1<=2); BOOST_ASSERT(s2>1); BOOST_ASSERT(s2>=1); } return 0; }