3 Nisan 2018 Salı

fibers

Giriş
Şu satırı dahil ederiz.
#include <boost/fiber/all.hpp>
Bu kütüphaneyi kullanmak için context kütüphanesi de gerekir. Açıklaması şöyle
boost_fiber depends upon boost_context. So you'll need -lboost_fiber -lboost_context at the end of the command line.
barrier Sınıfı
Constructor
Şöyle yaparız
boost::fibers::barrier barrier(4);
wait metodu
Şöyle yaparız
barrier.wait();
channel Sınıfı
Constructor
Önce bir typedef yaparız.
typedef boost::fibers::buffered_channel<T> channel_t;
Şöyle yaparız.
size_t n = ...;
channel_t chan(n);
pop metodu
Şöyle yaparız.
int a = 0;
channel.pop (a);
push metodu
Şöyle yaparız.
int a = 1000;
chan.push (a);
fiber Sınıfı
Constructor - global method
Şöyle yaparız.
void helloFiber() {
  ...
}
boost::fibers::fiber f (helloFiber);
Constructor - method + parametre
Örnek
future geçmek için söyle yaparız.
void helloFiber(boost::fibers::future<void> &f) {
  f.get ();
}


boost::fibers::future<void> ft = ...;
boost::fibers::fiber f (helloFiber, std::move (ft));
Örnek
barrier geçmek için şöyle yaparız.
boost::fibers::barrier barrier(2);
boost::fibers::fiber f ([](boost::fibers::barrier& barrier) {
  ...
}, std::ref(barrier) );
Örnek
Şöyle yaparız.
inline void doDatabaseCall( Document &msg ) {
  ...
}

Document msg;
...
boost::fibers::fiber f (doDatabaseCall, msg);
detach metodu
Şöyle yaparız.
f.detach ();
join metodu
Şöyle yaparız.
f.join();
future Sınıfı
Constructor
Şöyle yaparız.
boost::fibers::promise<void> pm;
boost::fibers::future<void> ft = pm.get_future ();
get metodu
Şöyle yaparız.
f.get ();
promise Sınıfı
Constructor
Şöyle yaparız.
boost::fibers::promise<void> pm;
get_future metodu
Şöyle yaparız.
boost::fibers::future<void> ft = pm.get_future ();
set_value metodu
Şöyle yaparız.
pm.set_value ();
this_fiber Sınıfı
get metodu
Şöyle yaparız
std::cout << "main fiber: " << boost::this_fiber::get_id() << std::endl;
Free Style Metodlar
Şöyle yaparız
boost::fibers::use_scheduling_algorithm< boost::fibers::algo::work_stealing >(4); 


range utilities iterator_range Sınıfı

Giriş
Şu satırı dahil ederiz.
#include <boost/range/iterator_range.hpp>
İki iterator aralığını range olarak temsil eder. range algoritmaları yanında yardımcı bir sınıftır. Açıklaması şöyle
iterator_range is bridge between ranges and iterators. For instance - you have pair of iterators, and you want pass them to algorithm which only accepts ranges. In that case you can wrap your iterators into range, using iterator_range. Or better - make_iterator_range - it will help to deduce types (like std::make_pair does):
Constructor
Örnek
Şöyle yaparız.
const char* s = ...;
boost::iterator_range<std::string::const_iterator> range {s, s + 10};
Örnek - make_iterator_range
Şu yöntemi kullanır.
make_iterator_range(iterator1,iterator2)
Şöyle yaparız.
Array arr={11,22,33,44,55,66,77,88};
boost::for_each( make_iterator_range(arr,arr+5) ,print());
empty metodu
Şöyle yaparız
std::vector<int> is { 1,2,3 };
auto range = boost::make_iterator_range(is.begin(), is.end());
std::cout << "range empty? " << std::boolalpha << range.empty() << "\n";

range = boost::make_iterator_range(is.end(), is.end());
std::cout << "range empty? " << std::boolalpha << range.empty() << "\n";

is.clear();

range = {};
std::cout << "range empty? " << std::boolalpha << range.empty() << "\n";
Çıktı olarak şunu alırız.
range empty? false
range empty? true
range empty? true