Ово је скуп типова који су статички - у време превођења - омеђени па није
могуће да се случајно употребе тако да дође до недефинисаног понашања. Стога
кажемо да су безбедни. Наравно, ово је Ц++ и сасвим можете да "кастујете"
ове типове у шта год хоћете и уђете у проблеме, али, у редовној употреби
не морате да се бринете да ли ће да целобројно додавање да оде ван опсега,
шта ће да буде ако позовете front()
на празном std::vector
и слично.
Као посебна погодност, нема потребе да се размишља о обради грешака
(изузеци, изузетна сигурност, кодови грешака и обрада истих).
Подржани су:
- Цели бројеви у датом опсегу. Слично као у Ади. Сем што су омеђени између, рецимо, 0 и 5, такође не могу да изађу из опсега свог типа (дакле, више као Спарк/Ада).
- Низови омеђени димензијом. Слични
std::array<>
, али индексирање се врши горенаведеним целим бројевима у опсегу димензије низа и нема "потенцијално небезбедне спреге". Неисправни итератори показују на "сигурно место", па ако их неко грешком дерефенцира, нема недефинисаног понашања. Свакако ћете имати неисправно понашање, али и безбедно, дакле није недефинисано. - Листе фиксног капацитета. Сличне листама из стандардне библиотеке, али, капацитет је познат у време превођења. Дакле, додавање у листу може да не успе услед недостатка места. Сви (потенцијални) чланови листе су у ”базену” чланова који је низ и заузет ”унапред”, што је веома другачије од СТЛ листа. Предност је што су итератори ”дереференцијабилни” докле год је њихова листа жива, с тим што можда нису више у листи (постоји функција да се то провери, али је спора па мора изричито да се позове), али, нема недефинисаног понашања, само неспецифицираног и бубе су поновљиве. Управо, ако се не повезујете са СТЛ-ом, уместо итератора треба користити индексе, за које постоји паралелна спрега, а који су у том смислу безбедни.
- Листе на прескок (скиплисте) фиксног капацитета. Засад моделирају само
std::set<>
спрегу, по потреби лако могу да се додајуstd::multiset<>
,std::map<>
,std::multimap<>
. Остале напомене сличне као за опште листе.
Ово би требало да, уз већ наведене ограде, обезбеди исти ниво безбедности као Спарк/Ада ниво "без грешака у раду". То је виши ниво од већине "безбедних" програмских језика, укључујући и "чисту" Аду, која ове грешке хвата у току извршавања.
Други основни типови, као што су ниске, хеш табеле и претраживачка стабла нису засад изведени. Можда ће бити додати у будућности.
Просто ископирајте заглавља која су вам потребна где год желите и укључите их.
Код је прављен за и испробан са Ц++17. Требало би да ради и "под" Ц++14 уз ситне дораде, ако вам треба помоћ у томе, јавите.
Требало би да је прилично једноставно. Види пример. Прочитајте документацију ако примери нису довољни.
Ако користите алат meson
(мезон), постоји meson.build
, па можете ово складиште
да користите као мезон подпројекат, што би требало да одради шта је потребно у вези
са заглављима.