18 Mart 2014 Salı

boost


boost ile kullandığım bazı sınıfları not olsun diye aşağıya ekliyorum.

boost ve namespace
Boost kendi içindeki sınıfları saklamak için genellikle namespace içinde başka namespace'ler açıyor. Dışarı açılması istenilmeyen sınıflar içerdeki namespace'e yerleştiriliyorlar. Örnek:

boost algorithm
join işlemi için String Algoritmaları yazısına bakabilirsiniz.

boost any
Bu sınıf kendi içinde new ile alınan bir pointer tutuyor. Boost any type_erasure'a dayalıdır. Bu sınıf ile kullanılan bir değer artık sadece any_cast ile geri alınabilir. Örnek:


boost::any var = std::string("StackOverflow");
std::cout << boost::any_cast<std::string>(var) << std::endl;
boost any move constructor'ı desteklemiyor. Ancak ileride mutlaka destekleyecektir.

Bu sınıfa daha güzel bir alternatif variant sınıflar. Örnek:

boost asio
acceptor sınıfı
acceptor sınıf içine bir socket alır ve async_accept metodu çağırılır. Örnek:

void Server::Accept() {
  socket_.reset(new boost::asio::ip::tcp::socket(*io_service_));
  acceptor_.async_accept(*socket_,
                         boost::bind(&Server::HandleAccept, this, boost::asio::placeholders::error));
}

void Server::HandleAccept(const boost::system::error_code& error) {
  if (!error) {
    // TODO
  } else {
    TRACE_ERROR("Server::HandleAccept: Error!");
  }
  Accept();
}
boost assign
vector'u doldurmak
+= operatörü ile doldurulabilir.
Örnek:

map'i doldurmak
map_list_of metodu ile doldurulabilir.
Aşağıdaki örneği buradan aldım. Bir map'e değer atamayı gösteriyor.
#include <set>
#include <map>
#include <stdint.h>
#include <boost/assign/list_of.hpp>

typedef std::map< uint32_t, std::set< uint32_t> > the_map_t;

the_map_t data = boost::assign::map_list_of <uint32_t, std::set< uint32_t> >
                                                                            ( 1, boost::assign::list_of(10)(20)(30) )
                                                                            ( 2, boost::assign::list_of(12)(22)(32) )
                                                                            ( 3, boost::assign::list_of(13)(23)(33) )
                                                                            ( 4, boost::assign::list_of(14)(24)(34) );

list_of sınıfı doldurulmak istenen Container nesnesinin iki tane iterator alabilmesini istiyor.

boost atomic
Konu için Atomik İşlemler yazısına bakabilirsiniz.

boost bimap
Bimap ile iki yönlü bir map tutmak mümkün. Örnek: Dikkat edilmesi gereken nokta bimap kütüphanesinin kendi altında da include edilmesi gereken dosyala olabilir.
#include <boost/bimap/bimap.hpp>
#include <boost/bimap/vector_of.hpp>
boost circular_buffer
push_back
Örnek:
#include <boost/circular_buffer.hpp>
boost::circular_buffer<int> cbuff(100);
cbuff.push_back(1);
boost datastructures
Bu projede envai çeşit heap veri yapısı var. En kolayı balanced binary heap.

fibonacci_heap
Örnek:
tpedef boost::heap::fibonacci_heap<struct c*, boost::heap::compare<compare>> myheap;
paring_heap
Örnek:
typedef boost::heap::pairing_heap<struct c, boost::heap::compare<my_compare> > myheap;

boost dynamic_bitset
#include <boost/dynamic_bitset/dynamic_bitset.hpp>
boost::dynamic_bitset<> test1( std::string("1111") );
Bu sınıf Java'daki BitSet sınıfını andırıyor.
 
find_first() metodu
atanmış olan ilk biti bulur. Örnek:
#include <boost/dynamic_bitset.hpp>
//10 bit uzunluğunda. değeri 50 ata
boost::dynamic_bitset<> bitset(10, 50);

typedef boost::dynamic_bitset<>::size_type size_type;
size_type first_idx = bitset.find_first(); 
 
boost exception
boost exception altındaki diagnostic_information sınıfı ile exception string'e çevirilebiliyor. Örnek:
boost flat_map
flat_map ile map arayüzüne sahip ancak arka tarafta array kullanan bir veri yapısı sunuluyor.

boost functional
hash alabilme yeteneği sunuyor. hash açıklamasını buraya taşıdım.

boost format
 format kütüphanesi kendi içinde bir ostream kullanır ve formatlanması istenen nesnenin operator<< fonksiyonunu tanımlamasını bekler. Örnek
boost future
future ve promise bir şekilde beraber kullanılıyorlar sanırım. 
wait_for

boost::promise<void> p;
boost::future<void> f = p.get_future();
boost::thread t([&]() { invoke(request, response); p.set_value(); });
bool did_finish = (f.wait_for(boost::chrono::milliseconds(timeout)) == boost::future_status::ready)

boost generator iterator
Verilen generator kullanılarak bir input iterator yaratılır. Infinite sequence yapma örneği:

boost heap
priority heap örneği buradan geldi.

boost interval container library
boost::icl::interval_map için örnek bulmam lazım.

boost interprocess

Örneği buradan aldım.
#include <boost/interprocess/windows_shared_memory.hpp>
#include <boost/interprocess/mapped_region.hpp>
#include <cstring>
#include <cstdlib>
#include <string>
using namespace boost::interprocess;

//Yazma için
//Create a native windows shared memory object.

windows_shared_memory shm (create_only, "MySharedMemory", read_write, 1000);

//Map the whole shared memory in this process
mapped_region region(shm, read_write);

//Write all the memory to 1
std::memset(region.get_address(), 1, region.get_size());

//Okuma için
//Open already created shared memory object.

windows_shared_memory shm (open_only, "MySharedMemory", read_only);

//Map the whole shared memory in this process
mapped_region region(shm, read_only);

//Check that memory was initialized to 1
char *mem = static_cast<char*>(region.get_address());
Buradaki örnekte ise windows_shared_memory yerine daha portable olduğunu sandığım bir başka kod kullanılmış.

#include "boost/interprocess/file_mapping.hpp"
#include "boost/interprocess/mapped_region.hpp"
using namespace boost::interprocess;

//Create a shared memory object.
file_mapping m_file("MySharedMemory", read_write);

//Map the whole shared memory in this process
mapped_region region(file_mapping, read_write);

//when done
file_mapping::remove("MySharedMemory");
Örnekte ise  memory mapped file üzerinde karakter karakter dolaşma var.

boost::irange
Range başlıklı yazıya bakınız.

boost iterator_adaptor
Verilen iki range'i birleştiren bir iterator adaptor örneği burada. Bir başka örnek ise burada.

iterator_adaptor tanımlamak için kullanılan kod aşağıdakine benzer.

class myiterator : public boost::iterator_adaptor<CRTP,iterator,iterator::value_type>
{
}

CRTP , Curiously recurring template pattern anlamına gelir. İkinci parametre gerçek iterator, üçüncü parametre ise iterator'ün döndürdüğü veri tipini anlamına gelir.

boost I/O kütüphanesi
Bu konu ile ilgili yazıları Boost I/O kütüphanesi başlıklı yazıya taşıdım.

boost lexical_cast
Verilen string'i sayıya çevirmek için kullanılır. Aslında çok basit bir şekilde aşağıdaki gibi yazılabilir.

boost::lockfree
Bu kütüphane lock free kuyruk sunuyor.
Örnek:
typedef boost::lockfree::queue<MyMessage> MessageQueue;
Eğer istenirse kuyruğun uzunluğu sabit yapılabilir ancak uzunluk 65535'ten büyük olamaz. Örnek:
typedef boost::lockfree::queue<int, boost::lockfree::fixed_size<true>> MyQueue;
MyQueue queue(1024);

Kullanım kuralları burada.
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ı.

boost::lock_guard
Bu konu ile ilgili Posix Eşzamanlılık Yapıları başlıklı yazıya göz atabilirsiniz. 

boost log
Buradaki örnekte boost::log sınıfını daha kolay kullanmak için macrolar tanımlanmış.
boost math distribution
normal distribution
Örnek:
boost multiindex
İç modelinin aşağıdaki şekle benzediğini düşünüyorum.

boost multiprecision
Bu sınıf C++ ile işlenemeyecek kadar büyük sayıları kullanabilmeyi sağlar. Örnek:
#include <boost/multiprecision/cpp_int.hpp>
boost::multiprecision::cpp_int bigint = 113850000000;

boost noncopyable
Bir sınıfın copy constructor metodunu private yaparak kopyalanmasını engeller. Örnek:
#include <boost/noncopyable.hpp>
class foo : boost::noncopyable { };
 
boost program_options

Komut Satırı Parse Etme yazısına bakılabilir.

boost range adaptors
boost range adaptors ile bir range dönüştürülerek başka bir range elde ediliyor.
Aşağıdaki örneği buradan aldım ve dönüşümü gösteriyor.

boost optional
Örnek:
boost::optional<MyClass> i;
i = MyClass(4,5);
return i;
boost scoped_ptr
std::auto_ptr'nin tersine release metodu yoktur ve pointer başka bir değişkene aktarılamaz.
boost::scoped_array de aynı mantıkla çalışır ancak array veri yapılarını "delete []" ile siler.

boost serialization
Konuyu serialization başlıklı yazıya taşıdım.

boost signalboost signal kütüphanesi artık kullanılmıyor. signal2 kütüphanesini kullanmak lazım.
Örnek:

#include "boost/signal.hpp"

typedef boost::function<void () > Handler;
boost::signal<void ()> m_signal;

void Register(Handler h)
{  m_signal.connect(h); }
   
void operator() ()
{  m_signal(); }
   
boost tuple
std::tuple çıktıktan sonra belki gerek kalmadı ancak örnek olsun diye aldım.
#include <boost/fusion/include/boost_tuple.hpp>
boost::tuple< std::string, int > t = boost::make_tuple( "foo", 42 ); 
 
boost unit
boost unit kütüphanesi stream ile gayet iyi çalışıyor ancak printf gibi metodlarla çalışmıyor. Çalıştırmak için aşağıdaki örnek kullanılabilir. 

Hiç yorum yok:

Yorum Gönder