20 Nisan 2017 Perşembe

iterator iterator_facade Sınıfı

iterator_facade Sınıfı
Tanımlama
Template için kullanılan ilk parametre sınıfımızın kendisidir. İkinci parametre iterator'ün kullanacağı tiptir. Üçüncü parametre iterator'ün tipidir.

Tanımlama - single_pass_traversal_tag
Şöyle yaparız.
class RegistryValueIterator
    : public boost::iterator_facade< RegistryValueIterator,
                                     RegistryValueEntry,
                                     boost::single_pass_traversal_tag >
{
}
Tanımlama - std::output_iterator_tag
Şöyle yaparız.
class putc_iterator : public boost::iterator_facade<
  putc_iterator,
  int,
  std::output_iterator_tag
>
{
...
};

asio steady_timer Sınıfı

Giriş
Şu satırı dahil ederiz.
#include <boost/asio/steady_timer.hpp>
Chrono monotonic saatini kullanır. Daha rahat kullanmak için şu satırı dahil ederiz.
using boost::asio::steady_timer;
Bu timer için kullanılan çağıları görmek için şöyle yaparız.
#define BOOST_ASIO_ENABLE_HANDLER_TRACKING 1
Çıktıyı görmek için şu uygulamayı kullanırız.
boost/libs/asio/tools/handlerviz.pl
Periyodik Timer
Handler içinde (eğer error_code atanmamış ise) şöyle yaparız.
void handle_timeout(const boost::system::error_code& ec)
{
  if (!ec) {
    t.expires_from_now (...); //tekrar kur
    t.async_wait (handle_timeout);
  }
}
restart
Asio timer sınıfları periyodik değiller. Aynı zamanda durdurup tekrar başlatma imkânı da vermiyorlar. Ancak bu metodları yazması kolay. Şöyle yaparız.
t.cancel ();
t.expires_from_now (...);
t.asynx_wait (...);

Constructor
Şöyle yaparız.
boost::asio::io_service ios;
boost::asio::steady_timer t (ios);
Constructor - time
Şöyle yaparız.
steady_timer t {ios, std::chrono::seconds{3}};
Destructor
Açıklaması şöyle
It is safe for a timer to be destroyed with outstanding wait operations. The outstanding wait operations will be implicitly cancelled within the timer's destructor.

async_wait metodu
Şöyle yaparız.
t.async_wait([](const boost::system::error_code &ec)
  {...});
cancel metodu
Başlatılmış bir timer nesnesini iptal etmek içindir. Şöyle yaparız.
t.cancel();
Handle metodunda hata kontrolu için şöyle yaparız.
void handle_timeout(const boost::system::error_code& ec)
{
  if (!ec) {
    ...
  } 
  else if (ec != boost::asio::error::operation_aborted) {
    std::cerr "handle_timeout error " << ec.message() << "\n";
  }
}
expires_at metodu
Şöyle yaparız.
t.expires_at(Timer::clock_type::time_point::min());
expires_from_now metodu - getter
Şöyle yaparız.
if(t.expires_from_now() <= std::chrono::seconds(0))
  ...
}
expires_from_now metodu - setter
Şöyle yaparız.
t.expires_from_now (boost::posix_time::seconds(5));
Şöyle yaparız.
t.expires_from_now (boost::chrono::seconds(5));
Şöyle yaparız. Ben hep bu yöntemi kullandım.
t.expires_from_now (std::chrono::seconds(5));
get_io_service metodu
Şöyle yaparız.
timer.get_io_service().post([](){
  ...
});


18 Nisan 2017 Salı

17 Nisan 2017 Pazartesi

random random_device Sınıfı

Giriş
Şu satırı dahil ederiz.
#include <boost/random/random_device.hpp>
Kullanım
Bir distribution nesnesi tarafından kullanılır. Şöyle yaparız.
mp::cpp_int x = mp::pow(mp::cpp_int(2), 1024);


boost::random::random_device gen;
boost::random::uniform_int_distribution<mp::cpp_int> dist (1, x);

mp::cpp_int y = dist (gen);
Constructor
Şöyle yaparız.
boost::random::random_device gen;


16 Nisan 2017 Pazar

log expressions stream Sınıfı

stream Sınıfı
Giriş
Şu satırı dahil ederiz.
#include <boost/log/expressions.hpp>
Şu isim alanını dahil ederiz.
namespace expr = boost::log::expressions;
Şu isim alanını dahil ederiz.
namespace attr = boost::log::attributes;
Bu sınıf formatter'a çevrilebiliyor. Şöyle yaparız.
boost::log::formatter get_my_formatter ()
{

  return boost::log::expressions::stream
    << ...
    << ...
    << ...
    << ...
    << ...
    << ...
    << ...;
}
Şöyle yaparız.
auto format = expr::stream
  << ...
  << ...
  << ...;
formatter ise bir sink ile kullanıyor. Şöyle yaparız.
sink->set_formatter (get_my_formatter ());
Eğer alanlar için karakter büyüklüğü tanımlamak istersek expressions::format çağrısı ile birlikte kullanırız.

FileName
Şöyle yaparız.
expr::stream
  << expr::attr<std::string>("FileName")
Function
Şöyle yaparız.
expr::stream
  << expr::attr<std::string>("Function")
level
Elimizde 4 tane level(attribute) olsun
"error","warning","exception","action".
Şöyle kullanırız.
BOOST_LOG_SEV(_logger, level) << message;
Şöyle yaparız.
boost::log::expressions::stream
    << boost::log::expressions::attr< std::string >("level")
Line
Şöyle yaparız
expr::stream
  << ":" << expr::attr<int>("Line")
line id
Şöyle yaparız.
boost::log::expressions::stream
  //<< std::hex  //To print the LineID in Hexadecimal format
  << std::setw(6) << std::setfill('0')
  << line_id
Şu şekilde kullanırız
%LineID%
Çıktı olarak şunu alırız
... 1 ...
... 2 ...
... 3 ...
max_size_decor
Mesajın en fazla 100 karakter olmasını sağlar. Şöyle yaparız.
expr::stream
  << ...
  << expr::max_size_decor (1000)
    [
      expr::stream << expr::smessage
    ]
ProcessId
Şöyle yaparız.
expr::stream << expr::attr< attrs::current_process_id::value_type > ("ProcessID");
severity
Bu formatter için factory oluşturmamız gerekir. Şöyle yaparız.
boost::log::register_simple_formatter_factory
  < boost::log::trivial::severity_level, char >("Severity");
Şu şekilde kullanırız
%Severity%
Şöyle yaparız.
boost::log::expressions::stream
  << boost::log::trivial::severity
Attribute olarak kullanıp daha sonra filtrelerde kullanmak istersek şöyle yaparız.
expr::stream
  << "[" << expr::attr< boost::log::trivial::severity_level >("Severity") << "]"
ThreadId
Şöyle yaparız.
expr::stream
  << expr::attr< boost::thread::id >("ThreadID")
Sanırım sadece şu sabiti kullansak ta olur.
[%ThreadID%]
Şöyle yaparız.
expr::stream
  << ...
  << " [" << expr::attr<attr::current_thread_id::value_type>("ThreadID") << "]"
  << ... 
Timestamp
Hour:Minute:Second
Şöyle yaparız.
std::string str ("%H:%M:%S");
if (bSubSeconds)
  str += ".%f";

boost::log::expressions::stream
  << boost::log::expressions::format_date_time<boost::posix_time::ptime>
    ("TimeStamp", str) 
Day:Month:Year Hour:Minute:Second 
Şöyle yaparız.
expr::stream
<<expr::format_date_time <boost::posix_time::ptime>
 ("TimeStamp", "%d-%m-%y %H:%M:%S")
Çıktı olarak şunu alırız
2016-Aug-23 17:51:36.852912 ...
Şöyle yaparız.
expr::stream << expr::format_date_time <boost::posix_time::ptime>
  ("TimeStamp", "[%Y-%m-%d_%H:%M:%S.%f] ");
smessage
Şöyle yaparız.
boost::log::expressions::stream
  << boost::log::expressions::smessage;
Şöyle yaparız
expr::stream
  << expr::xml_decor[expr::stream << expr::smessage]
Sanırım sadece şu sabiti kullansak ta olur.
"%Message%"
Diğer
if_ koşulu
Şöyle yaparız.
sink->set_formatter
(
  expr::stream
    << expr::if_(logging::trivial::severity <=
                 logging::trivial::severity_level::trace)
    [
      expr::stream << "<font color='black'>"
    ]
    .else_
    [
      expr::stream << expr::if_(logging::trivial::severity <=
                                logging::trivial::severity_level::debug)
      [
        // ...
      ]
    ]
    << expr::format_date_time<boost::posix_time::ptime>(
        "TimeStamp", "%Y.%m.%d-%H:%M:%S-UTC")
    << ": <" << logging::trivial::severity << "> " << expr::smessage
);