Boost Concept Check Library

Relaterede dokumenter
Essays on C++ Concepts

Specialeforsvar: Fundamentet for et fleksibelt container bibliotek

Kursusarbejde 3 Grundlæggende Programmering

Design by Contract Bertrand Meyer Design and Programming by Contract. Oversigt. Prædikater

Kursusarbejde 2 Grundlæggende Programmering

Programmering og Problemløsning, 2017

Send fra Java. Denne artikel fortæller hvad man skal bruge og hvordan man skal kode for at sende fra Java.

Den forudsætter kendskab til C++ og lidt kendskab til SQL og MySQL C API.

DM502. Peter Schneider-Kamp

Abstrakte datatyper C#-version

F# - hvorfor, hvordan og til hvad? Rune Ibsen Jyske Bank

Online kursus: C++ Programming

Effektivitetsmåling på krydsninger af svage og binomiale prioritetskøer

Undersøgelse og implementation af effektiv inplace merge. Kristoffer Møllerhøj & Christian Ulrik Søttrup

Programmering i C. Lektion december 2008

A Profile for Safety Critical Java

Programmering i C. Lektion september 2009

Java Klasse nedarvninger

DM14-1. Obligatorisk opgave F.06. System Call. Jacob Aae Mikkelsen Ingen andre gruppe medlemmer. 6. marts 2005

b) Udvid din implementation af forme til at understøtte.equals. To objekter af samme form er ens hvis de har samme værdier i felterne.

METODER ARV KLASSER. Grundlæggende programmering Lektion 5

Specifikation Abstrakt OO OS-API Rev Specifikation. Abstrakt, objektorienteret operativsystem-api

Scripting. Opslag til (Vol. D. Dahlerup. Bemærk. Anvendte bøger: "Sams. og proteiner.

.NET 4.0 og C# 4.0. Denne artikel beskriver nogle af de nye features i.net 4.0 og C# 4.0. Den forudsætter et vist kendskab til.net og C#.

Datalogi OB, Efterår 2002 OH er, forelæsning 10/ Klasser og nedarvning

Kursusarbejde 4 Grundlæggende Programmering

Processer og tråde. dopsys 1

PARALLELIZATION OF ATTILA SIMULATOR WITH OPENMP MIGUEL ÁNGEL MARTÍNEZ DEL AMOR MINIPROJECT OF TDT24 NTNU

A Comparative Analysis of Three Different Priority Deques af: Søren Skov & Jesper Holm Olsen

Systemkald DM Obligatoriske opgave. Antal sider: 7 inkl. 2 bilag Afleveret: d. 18/ Afleveret af: Jacob Christiansen,

Løsning af møntproblemet

Real-time programming safety in Java and Ada

Hvilket sprog er hurtigst

RMI introduktion. Denne artikel beskriver Java RMI (Remtote Method Invocation).

INGENIØRHØJSKOLEN I ÅRHUS Elektro- og IKT-afdelingen. I3PRG3 + I3DTM3 + I3ISY1-3. semester

Hvis du synes at det ligner græsk så fortvivl ikke, inden artiklen er omme vil du synes at det er logik for begyndere.

Forelæsning Uge 4 Mandag

Plugin-arkitektur med.net

Planen for idag. Synkroniseringsmekanismer. Krav til løsning. Kritiske regioner. Bagerens algoritme. Kritisk region via delt lager.

Projekt arbejde til kurset Advanced Models and Programs, SASP-AMP 2008 Poul Brønnum, IT Universitetet i København, Maj Indholdsfortegnelse

Programmering og Problemløsning, 2017

Klasser og nedarvning

Yderligere udvidelser af oversætter for Minimal

AAU, Programmering i Java Intern skriftlig prøve 18. maj 2007

Sekvensafstand DM34 - Eksamensopgave. Jacob Aae Mikkelsen

Tredjepart webservices

Forelæsning Uge 4 Mandag

I3PRG3+I3DTM3+I3ISY1-3. semester

Sproget Six. Til brug i rapportopgaven på kurset Oversættere. Vinter Abstract

Lær Python dag 1 - modul 1

Da beskrivelserne i danzig Profile Specification ikke er fuldt færdige, foreslås:

Linguistic support for unit testing

Virkefeltsregler i Java

(fig.1. Eksempel på en almindelig entity)

Programmering og Problemløsning, 2017

Systemkald i Unix/Linux

Forelæsning Uge 3 Torsdag

Sikker kode? Gennemgang af mest almindelige hacker angreb

Introduktion til AOP i C#

Forelæsning Uge 4 Mandag

//Udskriver System.out.println("Hej " + ditfornavn + " " + ditefternavn + "."); System.out.println("Du er " + dinalder + " aar gammel!

Kernealphaerne Indhold af G1

Datalogi OB, Efterår 2002 OH er, forelæsning 3/ forstå datastrukturer og algoritmer (teoretisk forståelse og intuition)

Embedded controller, almen.

Programmering i C. Kursusintroduktion. Lektion september Målgruppe 2 Indhold 3 Form 4 Materiale. Målgruppe Indhold Form Materiale

DANMARKS TEKNISKE UNIVERSITET

Healthcare Apps. OUH Odense University Hospital & Svendborg Hospital. Kiel, Germany, November /12/13

Eksempel: et ordresystem note 5 Lagdeling s. 1

Klasser og Objekter i Python. Uge 46 Learning Python: kap 15-16,

Videregående Programmering for Diplom-E Noter

Faculty of Health Sciences. Basal Statistik. Overlevelsesanalyse. Lene Theil Skovgaard. 12. marts 2018

Forelæsning Uge 3 Torsdag

Kursusarbejde 1 Grundlæggende Programmering. Arne Jørgensen, klasse dm032-1a

Udvikling af DOTNET applikationer til MicroStation i C#

STS Designdokument. STS Designdokument

C++ Programmering V

Studiepraktik. Thomas Bøgholm Mikkel Hansen Jacob Elefsen

Stakke, køer og lidt om hægtede lister - kapitel 16 og 17

Fundamentale sprogbegreber

Design by Contract. Design and Programming by Contract. Oversigt. Prædikater

Videregående Programmering Obligatorisk opgave - 3. semester, efterår 2004

ESP30076 임베디드시스템프로그래밍 (Embedded System Programming)

Program Dokumentation PC Software Skrevet af. Gruppen. Version 1.0

DM507 Algoritmer og datastrukturer

RoE timestamp and presentation time in past

Programmering i C. Lektion oktober 2008

Delay(100); Man skriver fx blot delay(100); for at få Microcontrolleren til at vente 100 ms inden programmet fortsætter.

En textbox har et Validating event, med dette kan vi samme med en errroprovider checke input:

Programmering i C. Lektion november 2008

CLR Integration. Af Torsten Holtse, pbs Indhold

Lærevejledning. - en introduktion til maskinarkitektur. faraz@butt.dk Faraz Butt mads@danquah.dk Mads Danquah doktor@dyregod.dk Ulf Holm Nielsen

Black Jack --- Review. Spring 2012

Projekt DATA step view

Metoder Klasser Arv. Operatorer Løkker. Praksis eksempel. Grundlæggende programmering Lektion 3

X M Y. What is mediation? Mediation analysis an introduction. Definition

DM507 Algoritmer og datastrukturer

MySQL C API. Denne artikel beskriver hvordan man bruger MySQL C API. Der er beskrivelse af build med forskellige compilere.

Singleton pattern i C#

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) { int wmid, wmevent; programmering med

Transkript:

Boost Concept Check Library Kasper Egdø and Konstantin Barkaia Department of Computer Science University of Copenhagen Boost Concept Check Library p.1/19

Eksempel #include <list> #include <algorithm> int main(int, char*[]) std::list<int> v; std::stable_sort(v.begin(), v.end()); return 0; } Boost Concept Check Library p.2/19

Informativ fejlbesked /usr/.../stl_algo.h: In function void std:: inplace_stable_sort( _RandomAccessIter, _RandomAccessIter) [with _RandomAccessIter = std::_list_iterator<int, int&, int*>] : /usr/.../stl_algo.h:2446: instantiated from void std::stable_sort(_randomaccessiter, _RandomAccessIter) [with _RandomAccessIter = std::_list_iterator<int, int&, int*>] lucy_lou.cpp:6: instantiated from here /usr/.../stl_algo.h:2226: error: no match for operator- in last - first Boost Concept Check Library p.3/19

Concepts Et koncept beskriver den semantik en type skal have I praksis er et koncept en samling af funktioner som typen skal implementere F.eks. kræver std::stable_sort at den modtager RandomAccessIterators. En concept check klasse kan undersøge om en given type implementerer et givent concept Boost implementerer concept check klasser for samtlige koncepter i STL InputIterator ForwardIterator Assignable LessThenComparable... Boost Concept Check Library p.4/19

Ingen brug af concept checks template <class RandomAccessIterator> void stable_sort(randomaccessiterator first, RandomAccessIterator last)... } Boost Concept Check Library p.5/19

Brug af concept checks template <class RandomAccessIterator> void stable_sort(randomaccessiterator first, RandomAccessIterator last) boost::function_requires< boost::randomaccessiteratorconcept< RandomAccessIterator> >(); typedef typename std::iterator_traits< RandomAccessIter>::value_type value_type; } function_requires< LessThanComparableConcept< value_type> >();... Boost Concept Check Library p.6/19

Bedre fejlbesked (?) /vol/.../boost/concept_check.hpp: In member function void boost::comparableconcept<tt>::constraints [with TT = std::_list_iterator<int, int&, int*>] : /vol/.../boost/concept_check.hpp:48: instantiated from void boost::function_requires(boost::mpl::ident [with Concept = boost::comparableconcept<std::_list_iterator<int, /vol/.../boost/concept_check.hpp:633: instantiated from void boost::randomaccessiteratorconcept<tt>::co [with TT = std::_list_iterator<int, int&, int*>] /vol/.../boost/concept_check.hpp:48: instantiated from void boost::function_requires(boost::mpl::ident [with Concept = boost::randomaccessiteratorconcept< std::_list_iterator<int, int&, int*> >] fejltest.cpp:8: instantiated from void stable_sort(t, T) [with T = std::_list_iterator<int, int&, int*>] fejltest.cpp:14: instantiated from here. Boost Concept Check Library p.7/19

Brug af concept checks II template<class T> class X BOOST_CLASS_REQUIRE(T, boost, LessThanComparableConcept);... }; Boost Concept Check Library p.8/19

Eksempel: BidirectionalIteratorConcept template <class TT> struct BidirectionalIteratorConcept void constraints() function_requires< ForwardIteratorConcept<TT> >(); typedef typename std::iterator_traits<tt>::iterator_category C; function_requires< ConvertibleConcept<C, std::bidirectional_iterator_tag> >(); --i; // require predecrement operator i--; // require postdecrement operator } TT i; }; Boost Concept Check Library p.9/19

Implementation template <class RandomAccessIterator> void stable_sort(randomaccessiterator first, RandomAccessIterator last) boost::function_requires< boost::randomaccessiteratorconcept< RandomAccessIterator> >();... } template <class Concept> void function_requires() void (Concept::*x)() = Concept::constraints; ignore_unused_variable_warning(x); } Ved at tage adressen af constraints funktionen tvinges oversættelse af denne constraints kaldes aldrig Boost Concept Check Library p.10/19

Implementation #define BOOST_CLASS_REQUIRE(type_var, ns, concept) \ typedef void (ns::concept <type_var>::* func##type_var##concept)(); \ template <func##type_var##concept Tp1_> \ struct concept_checking_##type_var##concept }; \ typedef concept_checking_##type_var##concept< \ BOOST_FPTR ns::concept<type_var>::constraints> \ concept_checking_typedef_##type_var##concept Boost Concept Check Library p.11/19

Makroen ekspanderet template<class T> class X BOOST_CLASS_REQUIRE(T, boost, LessThanComparableConcept);... }; template <typename T> class X typedef void (boost::lessthancomparableconcept <T>::* A)(); template <A Tp1_> struct B }; typedef B<boost::LessThanComparableConcept<T>::constraints> C;... }; Boost Concept Check Library p.12/19

Arketyper Bruges til at kontrollere at en generisk konstruktion sætter de rette begrænsninger. F.eks. at unique_copy ikke trækker to iteratorer fra hinanden samtidig med at iteratorerne er defineret til at være ForwardIterators. Boost Concept Check Library p.13/19

Eksempel på brug af arketyper Følgende tester om unique_copy kun anvder funktionalitet som findes i InputIteratorer og OutputIterator som itererer over EqualityComparable og Assignable typer: boost::detail::dummy_constructor dummy_cons; typedef boost::equality_comparable_archetype< boost::assignable_archetype<> > ValueType; boost::input_iterator_archetype<valuetype> ri; boost::output_iterator_archetype<valuetype> ro(dummy_cons); unique_copy(ri, ri, ro); } ValueType er EqualityComparable ri er en InputIterator af type ValueType ro er en OutputIterator af type ValueType Boost Concept Check Library p.14/19

Implementation af arketyper template <class T = int> class null_archetype private: null_archetype() } null_archetype(const null_archetype&) } null_archetype& operator=(const null_archetype&) return *this; } public: null_archetype(detail::dummy_constructor) } }; Boost Concept Check Library p.15/19

Implementation af arketyper II template <class Base = null_archetype<> > class default_constructible_archetype : public Base public: default_constructible_archetype() : Base(static_object<detail::dummy_constructor>::get()) } default_constructible_archetype(detail::dummy_constructor x) : Ba }; Boost Concept Check Library p.16/19

Implementation af arketyper III template <class T> class forward_iterator_archetype public: typedef forward_iterator_archetype self; public: typedef std::forward_iterator_tag iterator_category; typedef T value_type; typedef const T& reference; typedef T const* pointer; typedef std::ptrdiff_t difference_type; forward_iterator_archetype() } self& operator=(const self&) return *this; } bool operator==(const self&) const return true; } bool operator!=(const self&) const return true; } reference operator*() const return static_object<t>::get(); } self& operator++() return *this; } self operator++(int) return *this; } }; Boost Concept Check Library p.17/19

Diverse Koncepter er et compile-tids fænomen Ingen runtime cost Har ingen effekt for betydningen af ens program Boost Concept Check Library p.18/19

Konklusion Concept checks gør det lidt simplere at forstå hvorfor ens kode ikke virker Arketyper kan hjælpe en med at finde fejl i ens implementation af generiske funktioner og containere Boost Concept Check Library p.19/19