26 Mart 2018 Pazartesi

process async_pipe ve async_read Kullanımı

Giriş
async_pipe nesnesi async_read() çağrısına geçilir. Genelde belli büüyklükte bellek alanı oluşturulur ve döngü ile okunur. Eğer döngü kurulmazsa bellek doluncaya ve EOF oluncaya kadar çağrı bekler. Çıktı bellek alanından büyükse ve döngü yoksa çalıştırdığımız uygulama takılabilir.

Örnek
Verinin tamamını okumak için şöyle yaparız.
boost::asio::streambuf recv_buffer;
boost::asio::async_read(out, recv_buffer,[&](error_code ec, size_t transferred) {
  ...
});
...

svc.run(); // Await all async operations
Örnek
Şöyle yaparız. Burada 8K'lık bellek ayrılıyor ve bir sefer okunuyor.
std::vector<char> v;

std::error_code build_ec;

v.resize(1024 * 8);

boost::asio::async_read(out, boost::asio::buffer(v),
  [&](const boost::system::error_code &ec, std::size_t size) {
    ...
});
Örnek
Şöyle yaparız. Burada 500 karakterlik bellek ayrılıyor ve döngü içinde okunuyor.
using Loop = boost::function<void()>;
using Buffer = std::array<char, 500>;


Loop read_loop;

Buffer recv_buffer;
std::size_t total_received = 0;
read_loop = [&read_loop, &out, &recv_buffer, &total_received] {
  out.async_read_some(boost::asio::buffer(recv_buffer),
    [&](error_code ec, size_t transferred) {
    
    total_received += transferred; 
    if (!ec)
      read_loop(); // continue reading
    });
};
Döngüyü bir kere başlatmak için şöyle yaparız.
read_loop(); // async

date_time gregorian to_simple_string metodu

Giriş
Bu sınıfın tersini yapan from_simple_string() metodu

Örnek
Şöyle yaparız.
using namespace boost::gregorian;

date d = day_clock::local_day();
std::cout << "Today is: " << to_simple_string(d)  << ".\n"
Çıktı olarak şunu alırız.
Today is: 2017-Mar-23.
Örnek
Şöyle yaparız.
const boost::gregorian::date dt{2018, 9, 14};
const std::string str = boost::gregorian::to_simple_string(dt);

std::cout << str << std::endl;
Çıktı olarak şunu alırız.
2018-Sep-14

date_time gregorian::date Sınıfı

date Sınıfı
Giriş
Şu satırı dahil ederiz.
#include <boost/date_time/gregorian/gregorian_types.hpp>
#include <boost/date_time/gregorian/gregorian.hpp>
Açıklaması şöyle
The implemented calendar is a "proleptic Gregorian calendar" which extends dates back prior to the Gregorian Calendar's first adoption in 1582. The current implementation supports dates in the range 1400-Jan-01 to 9999-Dec-31. Many references will represent dates prior to 1582 using the Julian Calendar, so caution is in order if accurate calculations are required on historic dates. See Calendrical Calculations by Reingold & Dershowitz for more details. Date information from Calendrical Calculations has been used to cross-test the correctness of the Gregorian calendar implementation.
Sadece date,month, year alanlarına sahiptir. Açıklaması şöyle
"Internally boost::gregorian::date is stored as a 32 bit integer type."
Constuctor - default
Şöyle yaparız. Epoch'u temsil eder.
boost::gregorian::date d;
Constructor - year + month + date
Şöyle yaparız.
boost::gregorian::date d1(1500, 6, 1);
boost::gregorian::date d2(4500, 6, 1);
Şöyle yaparız.
const boost::gregorian::date dt{2018, 9, 14};
Constructor - clock
Şöyle yaparız.
boost::gregorian::date d (boost::gregorian::day_clock::local_day());
Copy Constructor 
Şöyle yaparız.
boost::gregorian::date d = boost::gregorian::date_from_iso_string( "20161101");
Şöyle yaparız.
boost::gregorian::date d = second_clock::local_time().date();
day metodu
Şöyle yaparız.
short day = static_cast<short>(d.day())
julian_day metodu
Şöyle yaparız.
boost::posix_time::ptime p = ...;
int julianDay = p.date().julian_day();
month metodu
Şöyle yaparız.
short month = static_cast<short>(d.month())
year metodu
Şöyle yaparız.
int year = d.year();
Free Style Metodlar
date_from_tm metodu
Örnek ver

date_from_iso_string metodu
Şöyle yaparız. Eğer farklı bir format kullanmak istersek boost::gregorian::date_input_facet Sınıfı kullanılabilir.
boost::gregorian::date d = boost::gregorian::date_from_iso_string ("20161101");
from_simple_string metodu
from_simple_string metodu yazısına taşıdım.

operator + metodu - date_duration
date_duration days olarak düşünülmeli. date + 2 gün yapabiliriz. Şöyle yaparız.
date d = day_clock::local_day(),
date prev = d - months(1),
date next = d + months(1);

std::cout << "Today is: " << to_simple_string(d)  << ".\n"
  << "One month before today was: " << to_simple_string(prev) << "\n"
  << "One month from today will be: "    << to_simple_string(next) << "\n";
Çıktı olarak şunu alırız.
Today is: 2017-Mar-23.
One month before today was: 2017-Feb-23
One month from today will be: 2017-Apr-23
operator + metodu - date_duration
Tarihe yıl eklemek için şöyle yaparız.
boost::gregorian::date d1(2017, 6, 1);

const auto duration = boost::gregorian::years(3);
std::cout << d1 << " + " << duration.number_of_years() << "Y\n";
const auto d3 = d1 + duration;
operator - metodu - date_duration
date_duration days olarak düşünülmeli. Tarihten- 2 gün çıkarmak için şöyle yaparız.
date_duration days(2);
date d2 = d - days;
operator - metodu - date
Şöyle yaparız.
using boost::gregorian::date;
date a(1712, 1, 1);
date b(1713, 1, 1);

std::cout << (b - a).days() << "\n"; // 366, includes 30th February 1712
operator >> - stream'den okur
Şöyle yaparız.
std::istringstream stream = ...;
boost::gregorian::date d;
stream >> d;
operator << - stream'e yazar
Değeri atanmış bir nesneyi stream'e yazar. Şöyle yaparız.
boost::gregorian::date d = ...; 

std::ostringstream stream;
stream << d;
Şöyle yaparız.
boost::gregorian::date d = ...; 
std::cout << d;
Çıktı olarak şunu alırız.
2016-Nov-01
to_iso_string metodu
Şöyle yaparız. Eğer farklı bir format kullanmak istersek boost::gregorian::date_facet Sınıfı kullanılabilir.
boost::gregorian::date& d = ...
std::string yyyymmdd = boost::gregorian::to_iso_string (d);

to_simple_string metodu
to_simple_string metodu yazısına taşıdım.