30 Nisan 2017 Pazar

tokenizer escaped_list_separator Sınıfı

Giriş
Şu satırı dahil ederiz.
#include <boost/tokenizer.hpp>
Boş Token
Açıklaması şöyle
If multiple consecutive delimiters are encountered empty tokens will be produced when using boost::escaped_list_separator. Unlike boost::char_separator, boost::escaped_list_separator does not provide any constructor that allows you to pass in whether to keep or discard any empty tokens produced.
Elimizde şöyle bir string olsun.
"2   , 14   33  50   \"AAA BBB\""
Çıktı olarak şunu alabiliriz. 2 -> 3 tane boşluk->14...

Kullanım
boost::tokenizer ile birlikte kullanılır. boost::tokenizer sınıfının kurucu metoduna ikici parametre olarak geçilir. Şöyle yaparız.
boost::tokenizer<boost::escaped_list_separator<wchar_t>,
std::wstring::const_iterator, std::wstring> tok (str, separator);

for(auto beg=tok.begin(); beg!=tok.end();++beg)
  std::wcout << *beg << std::endl;
Constructor
Birinci parametre escape chars, ikinci parametre delimiter chars, üçünü parametre quote chars olarak belirtirlir.
Delimiter parametresi için açıklama şöyle
Any character in the string c, is considered to be a separator.
Örnek
Şöyle yaparız.
escaped_list_separator<char> list ('\\', ';', '\"')
Örnek
Şöyle yaparız.
std::wstring escSep(L"\\"); //escape character
std::wstring delim(L" \t\r\n,"); //split on spaces, tabs, new lines, commas
std::wstring quotes(L"\""); //allow double-quoted values with delimiters within

boost::escaped_list_separator<wchar_t> separator(escSep, delim, quotes);

25 Nisan 2017 Salı

lockfree

Giriş
Herb Sutter tarafından kaleme alınan bir producer bir de consumer thread için yazılmış Writing Lock Free Code yazısı da çok aydınlatıcı.

queue Sınıfı
queue Sınıfı yazısına taşıdım.

stack Sınıfı
T için kurallar şöyle
T must have a copy constructor
spsc_queue Sınıfı
spc_queue Sınıfı yazısına taşıdım.

23 Nisan 2017 Pazar

graph print_graph metodu

Giriş
Şu satırı dahil ederiz.
#include <boost/graph/graph_utility.hpp>
Örnek
Şöyle yaparız
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/graph_utility.hpp>

using graph = boost::adjacency_list<boost::setS, boost::setS, boost::undirectedS, 
    boost::property<boost::vertex_index_t, size_t> >;

int main() {
  graph g;
  auto A = add_vertex(3, g);
  auto B = add_vertex(44, g);
  auto C = add_vertex(1024102400, g);
  add_edge(A, B, g);
  add_edge(C, A, g);

  print_graph(g);
}
Çıktı olarak şunu alırız.
3 <--> 44 1024102400 
44 <--> 3 
1024102400 <--> 3 



graph dfs_visitor Sınıfı

Giriş
Şu satırları dahil ederiz.
#include <boost/graph/undirected_dfs.hpp>
#include <boost/graph/visitors.hpp>
Elimizde bir grah olsun
typedef boost::adjacency_list<
    boost::vecS,                        //OutEdgeList
    boost::vecS,                        //VertexList
    boost::undirectedS                  //Directed
> Graph;

typedef boost::graph_traits < Graph >::vertex_descriptor Vertex;
typedef boost::graph_traits < Graph >::edge_descriptor Edge;
Tanımlama
Şöyle yaparız.
struct detect_loops : public boost::dfs_visitor<>
{
  template <class Graph>
  void tree_edge(Edge e, const Graph& g) {
    ...
  }

  template <class Graph>
  void back_edge(Edge e, const Graph& g) {
    ...
  }

private:
  ...
};
Ayrıca şöyle yaparız.
struct detect_loops : public boost::dfs_visitor<>
{
  using colormap=std::map<Graph::vertex_descriptor, boost::default_color_type>;
  colormap vertex_coloring;

  using edgeColorMap=std::map<Graph::edge_descriptor, boost::default_color_type>;
  edgeColorMap  edge_coloring;
  ...
}
undirected_dfs metodu
Şu satırı dahil ederiz.
#include <boost/graph/depth_first_search.hpp>
#include <boost/graph/undirected_dfs.hpp>
Açıklaması şöyle
This algorithm needs color values on vertices and edges to keep track of the ones that have been parsed.
Örnek
Birinci parametre graph, ikinci parametre visitor, üçüncü parametre vertex associated map, dördüncü parametre edge associated map nesnesidir. Şöyle yaparız.
Graph g;
detect_loops vis;

boost::undirected_dfs (g, vis ,
  make_assoc_property_map (vis.vertex_coloring),
  make_assoc_property_map (vis.edge_coloring)
);
Örnek
Graph şöyledir
struct my_vertex { int a1; float a2; };
struct my_edge   { int b1; float b2; };

typedef adjacency_list<vecS, vecS, undirectedS, my_vertex, my_edge> graph_t;
Visitor şöyledir.
struct detect_loops : public boost::dfs_visitor<> {
  template <class Edge, class Graph>
  void back_edge(Edge e, const Graph& g) {
    std::cout << g[source(e,g)].a1 << " -- " << g[target(e,g)].a1 << "\n";
  }
};
Birinci parametre graph, ikinci parametre visitor, üçüncü parametre vertex associated map, dördüncü parametre edge associated map nesnesidir, beşinci parametre başlangıç düğümüdür. Parametreleri atamak için şöyle yaparız.
std::vector<default_color_type> vertex_color(num_vertices(g));
std::map<graph_t::edge_descriptor, default_color_type> edge_color;

auto idmap = get(vertex_index, g);
auto vcmap = make_iterator_property_map(vertex_color.begin(), idmap);
auto ecmap = make_assoc_property_map(edge_color);

graph_t::vertex_descriptor const start = 0;
Şöyle yaparız.
undirected_dfs(g, vis, vcmap, ecmap, start);
named-argument olarak çağırmak için şöyle yaparız.
undirected_dfs(g, 
        root_vertex(graph_t::vertex_descriptor(0))
        .visitor(vis)
        .vertex_color_map(vcmap)
        .edge_color_map(ecmap)
    );