27 Temmuz 2017 Perşembe

interprocess basic_string Sınıfı

Giriş
Şu satırı dahil ederiz.
#include <boost/interprocess/containers/string.hpp>
3 parametre alabilir. Birinci parametre genelde char, ikinci parametre std::char_traits<char>, üçüncü parametre bir başka allocator varsa kullanılıyor.

Tanımlama
Örnek
Şöyle yaparız.
typedef unsigned char uchar;

typedef allocator<char, managed_shared_memory::segment_manager> CharAllocator;

typedef basic_string<char, std::char_traits<char>, CharAllocator> MyShmString;
Örnek
typdef yerine C++11 tarzı using ile şöyle yaparız.
using CharAllocator = boost::interprocess::allocator
    < char
    , boost::interprocess::managed_shared_memory::segment_manager >;

using MyShmString = boost::interprocess::basic_string<char,
  std::char_traits<char>, CharAllocator>;
Örnek
allocator yerine scoped_allocator kullanmak için şöyle yaparız.
using Segment = bip::managed_shared_memory;
using Manager = Segment::segment_manager;
template <typename T>
using Alloc   = bc::scoped_allocator_adaptor<bip::allocator<T, Manager> >;

using String  = bip::basic_string<char, std::char_traits<char>, Alloc<char> >;

25 Temmuz 2017 Salı

geomety svg_mapper Sınıfı

Giriş
Şu satırı dahil ederiz.
#include <boost/geometry.hpp>
Polygon veya Multi Polygon nesnelerini svg olarak yazar.

Constructor
Nokta tipini belirlemek için şöyle yaparız.
using PointType = boost::geometry::model::d2::point_xy<double>;
Şöyle yaparız.
std::string filename = ...;
std::ofstream svg(filename);
boost::geometry::svg_mapper<PointType> mapper(svg, 400, 400);
svg_mapper yok olurken ofstream'e yazar

add metodu
Şöyle yaparız.
std::vector<TPolygon> polygons = ...;
mapper.add (polygons [1]);
Şöyle yaparız.
namespace bg = boost::geometry;
typedef bg::model::d2::point_xy<float> BoostPoint;
typedef bg::model::polygon<BoostPoint> BoostPolygon;
typedef bg::model::multi_polygon<BoostPolygon> BoostMultipolygon;

BoostPolygon input = ...;
BoostMultipolygon output = ...;

std::ofstream svg("output.svg");
boost::geometry::svg_mapper<BoostPoint> mapper(svg, 400, 400);
mapper.add(output);
mapper.add(input);
map metodu
Şöyle yaparız.
mapper.map(polygons, "fill:rgb(255,128,0);stroke:rgb(0,0,100);stroke-width:1");
Şöyle yaparız.
mapper.map(polygon,"fill-opacity:0.5;fill:rgb(153,204,0);stroke:rgb(153,204,0);
  stroke-width:0");
Farklı dış çizgiler ve doldurma renkleri ile şöyle yaparız.
mapper.map(p1, "fill-opacity:0.5;fill:rgb(153,204,0);stroke:rgb(153,204,0);
  stroke-width:2");
mapper.map(p2, "fill-opacity:0.5;fill:rgb(204,153,0);stroke:rgb(202,153,0);
  stroke-width:2");
Şöyle yaparız.
template <typename TPolygon>
void WritePolygonsToSVG(const std::vector<TPolygon>& polygons, 
  const std::string& filename)
{
  std::ofstream svg(filename);

  boost::geometry::svg_mapper<PointType> mapper(svg, 400, 400);

  for(size_t polygonID = 0; polygonID < polygons.size(); ++polygonID) {
    mapper.add(polygons[polygonID]);
    int redValue = 50 * polygonID; //This breaks with more than 5 polygons
    mapper.map(polygons[polygonID], 
      "fill:rgb(" + std::to_string(redValue) + 
      ",128,0);stroke:rgb(0,0,100);stroke-width:1");
  }
}





24 Temmuz 2017 Pazartesi

regex icu

Giriş
Şu satırı dahil ederiz.
//#define BOOST_HAS_ICU
#include <boost/regex.hpp>
#include <boost/regex/icu.hpp>
u32regex_replace metodu
Şöyle yaparız
auto umessage       = icu::UnicodeString::fromUTF8(pt.get("message.text", ""));
boost::u32regex regex = boost::make_u32regex("\\p{So}");

auto clean = boost::u32regex_replace(umessage, regex,
 UnicodeString::fromUTF8("<symbol>"));
u32regex_search metodu
Şöyle yaparız
boost::u32regex regex = boost::make_u32regex( "(?<subExprName>.*)$" );
boost::match_results<std::string::const_iterator> mr;
if( boost::u32regex_search(umessage, mr, regex ) )
    auto subExpr = mr[ "subExprName" ];