#include "fiko/parametre/birim.hpp" #include namespace fiko::parametre { namespace { constexpr double PI = 3.14159265358979323846; // Birim tablosu. Taban: uzunluk=mm, açı=rad, kütle=g, zaman=s. const Birim TABLO[] = { {"", BirimTuru::Boyutsuz, 1.0}, // Uzunluk (taban mm) {"mm", BirimTuru::Uzunluk, 1.0}, {"cm", BirimTuru::Uzunluk, 10.0}, {"m", BirimTuru::Uzunluk, 1000.0}, {"um", BirimTuru::Uzunluk, 0.001}, {"in", BirimTuru::Uzunluk, 25.4}, {"inch", BirimTuru::Uzunluk, 25.4}, {"ft", BirimTuru::Uzunluk, 304.8}, {"mil", BirimTuru::Uzunluk, 0.0254}, // thou (1/1000 inch) {"yd", BirimTuru::Uzunluk, 914.4}, // Açı (taban rad) {"rad", BirimTuru::Aci, 1.0}, {"deg", BirimTuru::Aci, PI / 180.0}, {"grad", BirimTuru::Aci, PI / 200.0}, // Kütle (taban g) {"g", BirimTuru::Kutle, 1.0}, {"kg", BirimTuru::Kutle, 1000.0}, {"mg", BirimTuru::Kutle, 0.001}, {"t", BirimTuru::Kutle, 1.0e6}, {"lb", BirimTuru::Kutle, 453.59237}, {"oz", BirimTuru::Kutle, 28.349523125}, // Zaman (taban s) {"s", BirimTuru::Zaman, 1.0}, {"ms", BirimTuru::Zaman, 0.001}, {"min", BirimTuru::Zaman, 60.0}, {"h", BirimTuru::Zaman, 3600.0}, {"hr", BirimTuru::Zaman, 3600.0}, }; } // namespace const Birim* birimBul(const std::string& sembol) { for (const Birim& b : TABLO) if (b.sembol == sembol) return &b; return nullptr; } CevirSonuc birimeCevir(double deger, const std::string& kaynak, const std::string& hedef) { const Birim* k = birimBul(kaynak); const Birim* h = birimBul(hedef); if (!k || !h || k->tur != h->tur) return {0, false}; // deger → taban → hedef return {deger * k->tabanKat / h->tabanKat, true}; } AyristirSonuc birimliAyristir(const std::string& metin) { const char* s = metin.c_str(); char* son = nullptr; const double d = std::strtod(s, &son); if (son == s) return {0, "", false}; // baş sayı yok while (*son == ' ' || *son == '\t') ++son; // araya boşluk std::string birim = son; while (!birim.empty() && (birim.back() == ' ' || birim.back() == '\t')) birim.pop_back(); return {d, birim, true}; } } // namespace fiko::parametre