Boost Program Options Kütüphanesi ve Kullanımı

Boost.Program Options kütüphanesini bu makalede elimizden geldiğince tanıtmaya çalışıcağım. Faydalı olması dileğiyle..

Nedir ?

Programlarımızın başlaması için ihtiyaç duyduğu değerleri konfigürasyon dosyası veya komut satırından alınmasını sağlayan esnek ve kullanışlı bir kütüphanedir. Verileri isim, değer şeklinde ikililer şeklinde muhafaza eder.

Kullanımı
Program Options kütüphanesinin kullanımı oldukça basittir. C++ diline aşina birinin rahatlıkla kullanabileceği bir kütüphanedir. Öncelikle derleme aşamasında sentaks hatası olmaması için

#include <boost/program_options.hpp>

   

şeklinde başlık dosyasını dahil etmemiz gerekiyor.

boost::program_options isim alanı için bundan sonra po kısaltmasını kullanacağım.

Öncelikle oluşturacağımız yapıyı tanımlamamız gerekiyor. Örneğin ;

po::options_description cmdline(“Command Line Options”);

  

po isim alanı içerisinde options_description sınıfı türünden cmdline isminde bir nesne (instance) oluşturuyoruz. Bu sınıfın yapılandırıcı işlevine (bundan sonra ctor diyeceğim) geçtiğimiz string ise bu nesnenin varoluş nedenini belirten bir açıklama. İsminden ve açıklamasından anlaşılacağı üzere bu değişkeni komut satırı argümanlarını almak için kullanacağız.

Şimdi sıra alacağımız parametreleri belirlemeye geldi. Bunun için po::options_description sınıfı içerisindeki add_options fonksiyonunu kullanacağız. Bu fonksiyonun geri dönüş değeri options_description_easy_init sınıfı türünden bir nesne bu nesnede içsel olarak overload edilmiş operator() fonksiyonlarını çağırarak oluşturduğumuz argümanları sınıfa geçer. Evet biraz kulağa karışık geliyor ama C++ dilinin en güzel yanlarından biride programcıya bu kadar geniş ve esnek bir yapı sunmasıdır. Örneği inceleyelim :

    string configFile;
    cmdline.add_options()
    	(“help,h”, “produce help message”)
    	(“version,v”, “program version”)
     	(“config,c”, po::value<string>(&configFile)->default_value(“/usr/local/etc/cppturkey.cfg”),    ”configuration file path”);

Verilen birinci argümanda help ve h birinci parametre olarak geçilmiş. İkinci parametre ise birinci parametrenin açıklaması. İlk iki fonksiyon çağrısı birbirinin aynısı olduğundan o yüzden direkt üçüncüye geçiyorum.

Burda dikkat ederseniz farklı bir operator() fonksiyonu çağrılmış. Burda yine 1. ve 3. parametrelerin işlevleri aynı. Fakat 2.parametre alınan argüman daha önce oluşturulan bir string değişkenine atanmış, bu da po içerisindeki bir template aracılığyla gerçekleşmiş. Bu değişkene default olarakta bir değer atayabilirsiniz yukarıda “/usr/local/etc/cppturkey.cfg” atandığı gibi.

Şimdi sıra geldi yapılan bu tanımlardan sonra verileri almaya ve onları (değişken, değer) şeklinde kaydetmeye. Aşağıdaki bölümü inceleyelim :

    po::variables_map vm;
    po::store(po::parse_command_line(argc, argv, cmdline), vm);
    po::notify(vm);

Yukarıda variables_map türünden vm adında bir nesne oluşturuluyor. Aslında bu sınıf std::map sınıfından türetilerek özelleştirilmiş bir pair(ikili) yapısıdır. Alt satırda ise komut satırı argümanları parse edilerek bu yapıya kaydediliyor. notify fonksiyonu da vm içerisindeki tüm nesneler için notify fonksiyonunu çağırıyor, böylelikle eger gerekliyse değer normak değişkene aktarılabiliyor.

Şimdi config dosyasından okumaya bir göz atalım. Aslında benzer çok yönü var o yüzden biraz hızlı geçicez. Bizim okuyacağımız dosyalar .ini tarzı dosyalardır. Bölüm başlıkları [ ] içinde belirtilmeli sonra ise yine değişken ve değer ikilileri gelmelidir.

[CPPTURKEY]
writer=islamyasar
gibi ..

Böylelike writer değişkenine CPPTURKEY.writer şeklinde hiyararşik şekilde erişebiliriz.

Örneğe geçelim :

    po::options_description configoptions(“Configuration Options”);
    configoptions.add_options()
                   (“CPPTURKEY.writer”, po::value<string>(&cppturkey), “CPP User Group Turkey”);

Örnekte de görüldüğü gibi aynı şekilde nesnelerimiz oluşturuyoruz. Yalnız burda CPPTURKEY.writer kısmında hiyararşik bir şekilde nesneyi belirtmeye dikkat edelim.

Okuma kısmı biraz farklılık gösteriyor komut satırı argümanlarından :

    ifstream ifs(“/usr/local/etc/cppturkey.cfg”);
    if(!ifs)
   	 cout << “can not open config file: ” << endl;
    else  {
    
    	 po::store(po::parse_config_file(ifs, configoptions), vm);
   	 po::notify(vm);
    }

Gördüğünüz gibi ifstream nesnesi oluşturarak dosyayı okuyoruz. Daha sonra ise yine parse_config_file‘ın başka bir overload’ına bu nesneyi ve daha önce oluşturduğumuz configoptions nesnesini parametre olarak veriyoruz.

Şimdi geldi bu değerleri kullanmaya örnekleri inceleyelim :

    if(vm.count(“help”)){
    	cout  « “size yardima her zaman haziriz. cppturkey.com :))” « endl;
    	return 0;
    }

    if(vm.count(“version”)) {
    	cout « “Boostla olan seruvenimiz devam edecek” « endl;
    	return 0;
    }

örneklerde olduğu gibi version parametresi atandıysa deyim işletilecek ve “Boostla olan seruvenimiz devam edecek” stringi ekrana verilecek.

Bunlar haricinde vm yapısının içerisindeki verilere :

vm[“CPPTURKEY.writer”].as() şeklinde de ulaşabilirsiniz bu ifade vm içerisindeki CPPTURKEY.writer’a atanmış değeri (mapped value) string olarak döndürecektir.

Islam Yaşar

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s