Boost.Generic: Concepts without Concepts Matt Calabrese

Boost.Generic: Concepts without Concepts

1/98

© 2011 Matt Calabrese

Overview What is Generic Programming? The End of C++0x Concepts Substitution Failure Is Not an Error A Brief History of Boost.Generic The Necessary Tools Built-in Concepts and Asserts Creating Concepts Creating Concept Maps Future Direction Questions

Boost.Generic: Concepts without Concepts

2/98

© 2011 Matt Calabrese

What is Generic Programming?

You Tell Me

Boost.Generic: Concepts without Concepts

3/98

© 2011 Matt Calabrese

What is Generic Programming? Programming Paradigm Stepanov and Musser STL, BGL, Boost.GIL, etc. Algorithm-Centric Lifting Requirements/Constraints Multi-Sorted Algebras Refinement Concept Mapping Archetypes Concept-Based Overloading Boost.Generic: Concepts without Concepts

4/98

© 2011 Matt Calabrese

The End of C++0x Concepts

Can't We All Just Get Along?

Boost.Generic: Concepts without Concepts

5/98

© 2011 Matt Calabrese

The End of C++0x Concepts Indiana Proposal IU – Siek, Gregor, Garcia, Willcock, Järvi, Lumsdaine Explicit Concepts by Default Allow “Auto” Concepts Concept Maps

Texas Proposal

Texas A&M – Bjarne Stroustrup, Gabriel Dos Rei All Concepts are Automatic No Explicit Concept Maps

Boost.Generic: Concepts without Concepts

6/98

© 2011 Matt Calabrese

Substitution Failure Is Not an Error

Or Is It!?*

*No, really, I'm not lying. It's not an error.

Boost.Generic: Concepts without Concepts

7/98

© 2011 Matt Calabrese

Substitution Failure Is Not an Error What is SFINAE? int negate(int i) { return -i; } template typename F::result_type negate(const F& f) { return -f(); } int neg1 = negate( 1 );

Boost.Generic: Concepts without Concepts

8/98

© 2011 Matt Calabrese

Substitution Failure Is Not an Error Boost.Enable_If template< bool B, class T = void > struct enable_if_c { typedef T type; }; template< class T > struct enable_if_c {} template< bool B, class T = void > struct disable_if_c : enable_if_c< !b, T > {}; template< class T > typename enable_if< has_trivial_destructor< T >::value >::type foo( T& bar ) { … } template< class T > typename disable_if< has_trivial_destructor< T >::value >::type foo( T& bar ) { … }

Boost.Generic: Concepts without Concepts

9/98

© 2011 Matt Calabrese

A Brief History of Boost.Generic

Or: How I Learned to Stop Worrying and Love the Preprocessor

Boost.Generic: Concepts without Concepts

10/98

© 2011 Matt Calabrese

A Brief History of Boost.Generic It all began with C++0x “auto” functions... template< class L, class R > ??? operator -( L lhs, R rhs ) { return lhs + -rhs; }

What should the return type be?

Boost.Generic: Concepts without Concepts

11/98

© 2011 Matt Calabrese

A Brief History of Boost.Generic It all began with C++0x “auto” functions... template< class L, class R > auto operator -( L lhs, R rhs ) -> decltype( lhs + -rhs ) { return lhs + -rhs; }

Boost.Generic: Concepts without Concepts

12/98

© 2011 Matt Calabrese

A Brief History of Boost.Generic It all began with C++0x “auto” functions... template< class L, class R > auto operator -( L lhs, R rhs ) -> decltype( lhs + -rhs ) { return lhs + -rhs; }

But isn't this redundant?

Boost.Generic: Concepts without Concepts

13/98

© 2011 Matt Calabrese

A Brief History of Boost.Generic It all began with C++0x “auto” functions... template< class L, class R > auto operator -( L lhs, R rhs ) -> decltype( lhs + -rhs ) { return lhs + -rhs; }

But isn't this redundant? Lambdas can deduce return types without redundancy. auto minus = []( L lhs, R rhs ) { return lhs + -rhs; };

Boost.Generic: Concepts without Concepts

14/98

© 2011 Matt Calabrese

A Brief History of Boost.Generic Ahh... much better! template< class L, class R > BOOST_AUTO_FUNCTION( operator -( L lhs, R rhs ) ) ( return lhs + -rhs )

Macros save the day!

Boost.Generic: Concepts without Concepts

15/98

© 2011 Matt Calabrese

A Brief History of Boost.Generic Ahh... much better! template< class L, class R > BOOST_AUTO_FUNCTION( operator -( L lhs, R rhs ) ) ( return lhs + -rhs )

Macros save the day! But how would we use enable_if here?*

*In the world of C++0x before discovering the new way to use enable_if

Boost.Generic: Concepts without Concepts

16/98

© 2011 Matt Calabrese

A Brief History of Boost.Generic More complicated macros, of course! template< class L, class R > BOOST_AUTO_FUNCTION( operator -( L const& lhs, R const& rhs ) , if ( is_vector_udt< L > ) ( is_vector_udt< R > ) ) ( return lhs + -rhs )

Boost.Generic: Concepts without Concepts

17/98

© 2011 Matt Calabrese

A Brief History of Boost.Generic template< class L, class R > BOOST_AUTO_FUNCTION( operator -( L const& lhs, R const& rhs ) , if ( is_vector_udt< L > ) ( is_vector_udt< R > ) , try ( lhs + rhs ) ( -rhs ) , if typename ( L::value_type ) ) ( return lhs + -rhs )

Okay, stop it already! Boost.Generic: Concepts without Concepts

18/98

© 2011 Matt Calabrese

A Brief History of Boost.Generic What if we used these ideas to make a macro for specifying concepts... [utility.arg.requirements] ...In these tables, T is an object or reference type to be supplied by a C++ program instantiating a template; a, b, and c are values of type (possibly const) T...

Boost.Generic: Concepts without Concepts

19/98

© 2011 Matt Calabrese

A Brief History of Boost.Generic What if we used these ideas to make a macro for specifying concepts... [utility.arg.requirements] ...In these tables, T is an object or reference type to be supplied by a C++ program instantiating a template; a, b, and c are values of type (possibly const) T...

BOOST_GENERIC_AD_HOC_CONCEPT ( (EqualityComparable)( (class) T ) , ( for ( (T const) a ) ( (T const) b ) ) , ( try ( a == b ) ) , ( if ( is_convertible< decltype( a == b ), bool > ) ) )

Boost.Generic: Concepts without Concepts

20/98

© 2011 Matt Calabrese

A Brief History of Boost.Generic What if we used these ideas to make a macro for specifying concepts... [utility.arg.requirements] ...In these tables, T is an object or reference type to be supplied by a C++ program instantiating a template; a, b, and c are values of type (possibly const) T...

BOOST_GENERIC_AD_HOC_CONCEPT ( (EqualityComparable)( (class) T ) , ( for ( (T const) a ) ( (T const) b ) ) , ( try ( a == b ) ) , ( if ( is_convertible< decltype( a == b ), bool > ) ) )

Boost.Generic: Concepts without Concepts

21/98

© 2011 Matt Calabrese

The Necessary Tools

What Can Be Accomplished and How

Boost.Generic: Concepts without Concepts

22/98

© 2011 Matt Calabrese

The Necessary Tools Overall Goals Represent Concepts as Closely as Possible to N2914 Support the Major Features of Concepts Keep the Error Messages Simple (Simpler than BCCL) Automatically Generate Archetypes Support Concept Overloading Allow a Choice of Backends Implement the Standard Concepts Minimize the Pain Inflicted on Compilers

Boost.Generic: Concepts without Concepts

23/98

© 2011 Matt Calabrese

The Necessary Tools Overall Goals Represent Concepts as Closely as Possible to N2914 Support the Major Features of Concepts Keep the Error Messages Simple (Simpler than BCCL) Automatically Generate Archetypes Support Concept Overloading Allow a Choice of Backends Implement the Standard Concepts Minimize the Pain Inflicted on Compilers (Just Kidding)

Boost.Generic: Concepts without Concepts

24/98

© 2011 Matt Calabrese

The Necessary Tools C++ 0x Syntax concept ArithmeticLike : Regular, LessThanComparable, HasUnaryPlus, HasNegate, HasPlus, HasMinus, … { explicit T::T(intmax_t); explicit T::T(uintmax_t); explicit T::T(long double); requires Convertible::result_type, T>; … }

Boost.Generic: Concepts without Concepts

25/98

© 2011 Matt Calabrese

The Necessary Tools C++ 0x Syntax concept ArithmeticLike : Regular, LessThanComparable, HasUnaryPlus, HasNegate, HasPlus, HasMinus, … { explicit T::T(intmax_t); explicit T::T(uintmax_t); explicit T::T(long double); requires Convertible::result_type, T>; … }

Hypothetical Macro Syntax BOOST_GENERIC_CONCEPT ( (ArithmeticLike)( (typename) T ) , ( public Regular, LessThanComparable, HasUnaryPlus, HasNegate, HasPlus, HasMinus, … ) , ( explicit (this(T))( (intmax_t) ) ) , ( explicit (this(T))( (uintmax_t) ) ) , ( explicit (this(T))( (long double) ) ) , ( requires Convertible::result_type, T> ) , … )

Boost.Generic: Concepts without Concepts

26/98

© 2011 Matt Calabrese

The Necessary Tools Just what can be accomplished (not a complete list)? Language-Level Concepts

Library-Based Concept Support

Associate Types

Yes

Associate Functions

Yes

Multi-type Concepts

Yes

Concept Maps

Yes

Archetypes

Yes

Concept Refinement

???

Typename Deduction

???

Concept-Based Overloading

???

Boost.Generic: Concepts without Concepts

27/98

© 2011 Matt Calabrese

The Necessary Tools List of Types Across a Translation Unit template< unsigned Val = 256 > struct num_elem : num_elem< Val - 1 > {}; template<> struct num_elem< 0 > {}; template< class Tag, class ThisElem = void, class OtherHolder = void > struct type_seq_holder { static unsigned const value = OtherHolder::value + 1; static num_elem< value + 1 > next_index(); typedef typename push_back< typename OtherHolder::type_seq, ThisElem >::type type_seq; }; template< class Tag > struct type_seq_holder< Tag > { static unsigned const value = 0; static num_elem< 1 > next_index(); typedef vector<> type_seq; }; template< class Tag > type_seq_holder< Tag > get_type_seq_holder( Tag, num_elem< 0 > const& ); #define ADD_TO_LIST( list_tag, new_elem )\ type_seq_holder< list_tag, new_elem, decltype( get_type_seq_holder( list_tag(), num_elem<>() ) ) >\ get_type_seq_holder\ ( list_tag, decltype( get_type_seq_holder(list_tag(), num_elem<>() ).next_index() ) const& ); #define GET_LIST( list_tag )\ identity< decltype( get_type_seq_holder( list_tag(), num_elem<>() ) ) >::type::type_seq

Boost.Generic: Concepts without Concepts

28/98

© 2011 Matt Calabrese

The Necessary Tools Just what can be accomplished (not a complete list)? Language-Level Concepts

Library-Based Concept Support

Associate Types

Yes

Associate Functions

Yes

Multi-type Concepts

Yes

Concept Maps

Yes

Archetypes

Yes

Concept Refinement

Yes

Typename Deduction

???

Concept-Based Overloading

???

Boost.Generic: Concepts without Concepts

29/98

© 2011 Matt Calabrese

The Necessary Tools Typename Deduction auto concept HasFind { typename key_type = typename T::key_type; typename mapped_type; std::pair< key_type, mapped_type > find( T const&, key_type const& ); } struct container { typedef int key_type; }; std::pair< int, float > find( container, int );

Boost.Generic: Concepts without Concepts

30/98

© 2011 Matt Calabrese

The Necessary Tools Typename Deduction auto concept HasFind { typename key_type = typename T::key_type; typename mapped_type; std::pair< key_type, mapped_type > find( T const&, key_type const& ); } struct container { typedef int key_type; }; std::pair< int, float > find( container, int );

Boost.Generic: Concepts without Concepts

31/98

© 2011 Matt Calabrese

The Necessary Tools Typename Deduction auto concept HasFind { typename key_type = typename T::key_type; typename mapped_type; std::pair< key_type, mapped_type > find( T const&, key_type const& ); } struct container { typedef int key_type; }; std::pair< int, float > find( container, int );

Very Common With Auto-Concepts auto concept HasDereference { typename result_type; result_type operator*(T&); result_type operator*(T&&); }

Boost.Generic: Concepts without Concepts

32/98

© 2011 Matt Calabrese

The Necessary Tools Typename Deduction 14.10.2.2 Associated type and template definitions

[concept.map.assoc]

“…A concept map member that satisfies an associated type or class template requirement can be implicitly defined using template argument deduction (14.9.2) with one or more associated function requirements (14.10.2.1), if the associated type or class template requirement does not have a default value. The definition of the associated type or class template is determined using the rules of template argument deduction from a type (14.9.2.5). – Let P be the return type of an associated function after substitution of the concept’s template parameters specified by the concept map with their template arguments, and where each undefined associated type and associated class template has been replaced with a newly invented type or template template parameter, respectively. – Let A be the return type of the seed in the associated function candidate set corresponding to the associated function. If the deduction fails, no concept map members are implicitly defined by that associated function. If the results of deduction produced by different associated functions yield more than one possible value, that associated type or class template is not implicitly defined…”

Boost.Generic: Concepts without Concepts

33/98

© 2011 Matt Calabrese

The Necessary Tools Typename Deduction BOOST_GENERIC_AUTO_CONCEPT ( (HasFind)( (typename) T ) , ( typename key_type, typename T::key_type ) , ( typename mapped_type ) , ( (std::pair< key_type, mapped_type >)(find)( (T const&), (key_type const&) ) ) )

Boost.Generic: Concepts without Concepts

34/98

© 2011 Matt Calabrese

The Necessary Tools Typename Deduction BOOST_GENERIC_AUTO_CONCEPT ( (HasFind)( (typename) T ) , ( typename key_type, typename T::key_type ) , ( typename mapped_type ) , ( (std::pair< key_type, mapped_type >)(find)( (T const&), (key_type const&) ) ) )

Boost.Generic: Concepts without Concepts

35/98

© 2011 Matt Calabrese

The Necessary Tools Typename Deduction BOOST_GENERIC_AUTO_CONCEPT ( (HasFind)( (typename) T ) , ( typename key_type, typename T::key_type ) , ( typename mapped_type ) , ( (std::pair< key_type, mapped_type >)(find)( (T const&), (key_type const&) ) ) )

Exploit Template Argument Deduction typedef typename T::key_type key_type; struct dummy_type {}; identity< dummy_type > deduce( ... ); template< class mapped_type > identity< mapped_type > deduce( identity< std::pair< key_type, mapped_type > > ); typedef decltype( deduce( identity< decltype( find( declval(), declval() ) ) >() ) ) deduce_result; typedef typename deduce_result::type mapped_type;

Boost.Generic: Concepts without Concepts

36/98

© 2011 Matt Calabrese

The Necessary Tools Just what can be accomplished (not a complete list)? Language-Level Concepts

Library-Based Concept Support

Associate Types

Yes

Associate Functions

Yes

Multi-type Concepts

Yes

Concept Maps

Yes

Archetypes

Yes

Concept Refinement

Yes

Typename Deduction

Yes

Concept-Based Overloading

???

Boost.Generic: Concepts without Concepts

37/98

© 2011 Matt Calabrese

The Necessary Tools Can we use a technique similar to tag dispatching? template< class It, class DiffT > void advance( It& it, DiffT offset ) { typedef typename std::iterator_traits< It >::iterator_category category; advance_impl( it, offset, category() ); } template< class It, class DiffT > void advance_impl( It& it, DiffT offset, std::input_iterator_tag ) /**/ template< class It, class DiffT > void advance_impl( It& it, DiffT offset, std::bidirectional_iterator_tag ) /**/ template< class It, class DiffT > void advance_impl( It& it, DiffT offset, std::random_access_iterator_tag ) /**/

We can start by automatically creating tags that are related by inheritance... Boost.Generic: Concepts without Concepts

38/98

© 2011 Matt Calabrese

The Necessary Tools Just what can be accomplished (not a complete list)? Language-Level Concepts

Library-Based Concept Support

Associate Types

Yes

Associate Functions

Yes

Multi-type Concepts

Yes

Concept Maps

Yes

Archetypes

Yes

Concept Refinement

Yes

Typename Deduction

Yes

Concept-Based Overloading

Almost

Boost.Generic: Concepts without Concepts

39/98

© 2011 Matt Calabrese

Built-in Concepts and Asserts

For the Lazy Programmers Who Want Me to Do All of the Work

Boost.Generic: Concepts without Concepts

40/98

© 2011 Matt Calabrese

Built-in Concepts and Asserts Which Concepts Are Currently Implemented?

78/78 0/20 8/8 0/6 [concept.support] 23/23

Boost.Generic: Concepts without Concepts

41/98

© 2011 Matt Calabrese

Built-in Concepts and Asserts The Basic Header Structure // Include all built-in concepts #include // Include all iterator concepts (akin to ) #include // Include just the forward iterator concept and its dependencies #include // Etc. // Include all assert macros #include

Concepts are based on N2914

Boost.Generic: Concepts without Concepts

42/98

© 2011 Matt Calabrese

Built-in Concepts and Asserts Concept Asserts BOOST_GENERIC_ASSERT( HasPlus< int*, int> ); BOOST_GENERIC_ASSERT_NOT( HasPlus< int*, int* > ); // Triggers a static_assert BOOST_GENERIC_ASSERT( HasPlus< int*, int* > )

Boost.Generic: Concepts without Concepts

43/98

© 2011 Matt Calabrese

Built-in Concepts and Asserts Concept Asserts BOOST_GENERIC_ASSERT( HasPlus< int*, int> ); BOOST_GENERIC_ASSERT_NOT( HasPlus< int*, int* > ); // Triggers a static_assert BOOST_GENERIC_ASSERT( HasPlus< int*, int* > )

has_plus.cpp:14:177: error: static assertion failed: "requires HasPlus< int*, int* >" has_plus.cpp:10:0: has_plus.hpp: In instantiation of 'boost::generic::std_concept::HasPlus': has_plus.cpp:14:543: instantiated from here has_plus.hpp:20:10224: error: static assertion failed: "typename \'result_type\' was not explicitly satisfied and cannot be deduced." has_plus.hpp: In instantiation of 'boost::generic::std_concept::HasPlus': has_plus.cpp:14:543: instantiated from here has_plus.hpp:20:10691: error: static assertion failed: "requires result_type operator +( const T& , const U& )"

Boost.Generic: Concepts without Concepts

44/98

© 2011 Matt Calabrese

Creating Concepts

Enough already, I want to make my own!

Boost.Generic: Concepts without Concepts

45/98

© 2011 Matt Calabrese

Creating Concepts Starting with the Basics... namespace boost { namespace generic { concept Foo {} } }

Boost.Generic: Concepts without Concepts

46/98

© 2011 Matt Calabrese

Creating Concepts Starting with the Basics... namespace boost { namespace generic { concept Foo {} } }

BOOST_GENERIC_CONCEPT ( ( namespace boost, generic ) , (Foo)( (typename) T ) )

Boost.Generic: Concepts without Concepts

47/98

© 2011 Matt Calabrese

Creating Concepts Starting with the Basics... namespace boost { namespace generic { concept Foo {} } }

BOOST_GENERIC_CONCEPT ( ( namespace boost, generic ) , (Foo)( (typename) T ) )

Boost.Generic: Concepts without Concepts

48/98

© 2011 Matt Calabrese

Creating Concepts Starting with the Basics... namespace boost { namespace generic { concept Foo {} } }

BOOST_GENERIC_CONCEPT ( ( namespace boost, generic ) , (Foo)( (typename) T ) )

Boost.Generic: Concepts without Concepts

49/98

© 2011 Matt Calabrese

Creating Concepts Starting with the Basics... namespace boost { namespace generic { concept Foo {} } }

BOOST_GENERIC_CONCEPT ( ( namespace boost, generic ) , (Foo)( (typename) T ) )

Boost.Generic: Concepts without Concepts

50/98

© 2011 Matt Calabrese

Creating Concepts Starting with the Basics... auto concept IdentityOf { typename type = T; requires SameType; }

Boost.Generic: Concepts without Concepts

51/98

© 2011 Matt Calabrese

Creating Concepts Starting with the Basics... auto concept IdentityOf { typename type = T; requires SameType; }

BOOST_GENERIC_AUTO_CONCEPT ( (IdentityOf)( (typename) T ) , ( typename type, T ) , ( requires SameType ) )

Boost.Generic: Concepts without Concepts

52/98

© 2011 Matt Calabrese

Creating Concepts Starting with the Basics... auto concept IdentityOf { typename type = T; requires SameType; }

BOOST_GENERIC_AUTO_CONCEPT ( (IdentityOf)( (typename) T ) , ( typename type, T ) , ( requires SameType ) )

Boost.Generic: Concepts without Concepts

53/98

© 2011 Matt Calabrese

Creating Concepts Starting with the Basics... auto concept IdentityOf { typename type = T; requires SameType; }

BOOST_GENERIC_AUTO_CONCEPT ( (IdentityOf)( (typename) T ) , ( typename type, T ) , ( requires SameType ) )

Boost.Generic: Concepts without Concepts

54/98

© 2011 Matt Calabrese

Creating Concepts Starting with the Basics... auto concept IdentityOf { typename type = T; requires SameType; }

BOOST_GENERIC_AUTO_CONCEPT ( (IdentityOf)( (typename) T ) , ( typename type, T ) , ( requires SameType ) )

Boost.Generic: Concepts without Concepts

55/98

© 2011 Matt Calabrese

Creating Concepts Starting with the Basics... auto concept IdentityOf { typename type = T; requires SameType; }

BOOST_GENERIC_AUTO_CONCEPT ( (IdentityOf)( (typename) T ) , ( typename type, T ) , ( requires SameType ) )

Boost.Generic: Concepts without Concepts

56/98

© 2011 Matt Calabrese

Creating Concepts Starting with the Basics... auto concept IdentityOf { typename type = T; requires SameType; }

BOOST_GENERIC_AUTO_CONCEPT ( (IdentityOf)( (typename) T ) , ( typename type, T ) , ( requires SameType ) )

Boost.Generic: Concepts without Concepts

57/98

© 2011 Matt Calabrese

Creating Concepts Member Function Requirements auto concept MemberFunctionRequirements { void T::foo() const; T::T( int a, float b ); T::~T(); }

Boost.Generic: Concepts without Concepts

58/98

© 2011 Matt Calabrese

Creating Concepts Member Function Requirements auto concept MemberFunctionRequirements { void T::foo() const; T::T( int a, float b ); T::~T(); }

BOOST_GENERIC_AUTO_CONCEPT ( (MemberFunctionRequirements)( (typename) T ) , ( (void)(this(T) foo)() const ) , ( (this(T))( (int) a, (float) b ) ) , ( (this(T) destroy)() ) )

Boost.Generic: Concepts without Concepts

59/98

© 2011 Matt Calabrese

Creating Concepts Member Function Requirements auto concept MemberFunctionRequirements { void T::foo() const; T::T( int a, float b ); T::~T(); }

BOOST_GENERIC_AUTO_CONCEPT ( (MemberFunctionRequirements)( (typename) T ) , ( (void)(this(T) foo)() const ) , ( (this(T))( (int) a, (float) b ) ) , ( (this(T) destroy)() ) )

Boost.Generic: Concepts without Concepts

60/98

© 2011 Matt Calabrese

Creating Concepts Member Function Requirements auto concept MemberFunctionRequirements { void T::foo() const; T::T( int a, float b ); T::~T(); }

BOOST_GENERIC_AUTO_CONCEPT ( (MemberFunctionRequirements)( (typename) T ) , ( (void)(this(T) foo)() const ) , ( (this(T))( (int) a, (float) b ) ) , ( (this(T) destroy)() ) )

Boost.Generic: Concepts without Concepts

61/98

© 2011 Matt Calabrese

Creating Concepts Member Function Requirements auto concept MemberFunctionRequirements { void T::foo() const; T::T( int a, float b ); T::~T(); }

BOOST_GENERIC_AUTO_CONCEPT ( (MemberFunctionRequirements)( (typename) T ) , ( (void)(this(T) foo)() const ) , ( (this(T))( (int) a, (float) b ) ) , ( (this(T) destroy)() ) )

Boost.Generic: Concepts without Concepts

62/98

© 2011 Matt Calabrese

Creating Concepts Member Function Requirements auto concept MemberFunctionRequirements { void T::foo() const; T::T( int a, float b ); T::~T(); }

BOOST_GENERIC_AUTO_CONCEPT ( (MemberFunctionRequirements)( (typename) T ) , ( (void)(this(T) foo)() const ) , ( (this(T))( (int) a, (float) b ) ) , ( (this(T) destroy)() ) )

Boost.Generic: Concepts without Concepts

63/98

© 2011 Matt Calabrese

Creating Concepts Operator Requirements auto concept HasEqualTo { bool operator==(const T& a, const U& b); }

Boost.Generic: Concepts without Concepts

64/98

© 2011 Matt Calabrese

Creating Concepts Operator Requirements auto concept HasEqualTo { bool operator==(const T& a, const U& b); }

BOOST_GENERIC_AUTO_CONCEPT ( (HasEqualTo)( (typename) T, (typename) U ) , ( (bool)(operator equal_to)( (const T&) a, (const U&) b ) ) )

Boost.Generic: Concepts without Concepts

65/98

© 2011 Matt Calabrese

Creating Concepts Operator Requirements auto concept HasEqualTo { bool operator==(const T& a, const U& b); }

BOOST_GENERIC_AUTO_CONCEPT ( (HasEqualTo)( (typename) T, (typename) U ) , ( (bool)(operator equal_to)( (const T&) a, (const U&) b ) ) )

Boost.Generic: Concepts without Concepts

66/98

© 2011 Matt Calabrese

Creating Concepts Operator Names plus +

greater_equal >=

complement ~

minus_assign -=

preincrement ++

minus -

equal_to ==

left_shift <<

multiply_assign *=

postincrement ++

divide /

not_equal_to !=

right_shift >>

divide_assign /=

predecrement --

modulus %

logical_and &&

dereference *

modulus_assign %=

postdecrement --

unary_plus +

logical_or ||

address_of &

bit_and_assign &=

comma ,

negate -

logical_not !

subscript []

bit_or_assign |=

new new

less <

bit_and &

call ()

bit_xor_assign ^=

new_array new []

greater >

bit_or |

assign =

left_shift_assign <<=

delete delete

less_equal <=

bit_xor ^

plus_assign +=

right_shift_assign >>=

delete_array delete []

multiply *

arrow ->

arrow_dereference ->*

Boost.Generic: Concepts without Concepts

67/98

© 2011 Matt Calabrese

Creating Concepts Operator Names plus +

greater_equal >=

complement ~

minus_assign -=

preincrement ++

minus -

equal_to ==

left_shift <<

multiply_assign *=

postincrement ++

divide /

not_equal_to !=

right_shift >>

divide_assign /=

predecrement --

modulus %

logical_and &&

dereference *

modulus_assign %=

postdecrement --

unary_plus +

logical_or ||

address_of &

bit_and_assign &=

comma ,

negate -

logical_not !

subscript []

bit_or_assign |=

new new

less <

bit_and &

call ()

bit_xor_assign ^=

new_array new []

greater >

bit_or |

assign =

left_shift_assign <<=

delete delete

less_equal <=

bit_xor ^

plus_assign +=

right_shift_assign >>=

delete_array delete []

multiply *

arrow ->

arrow_dereference ->*

Boost.Generic: Concepts without Concepts

68/98

© 2011 Matt Calabrese

Creating Concepts Conversion Operation Requirements auto concept ExplicitlyConvertible { explicit operator U(const T&); } auto concept Convertible : ExplicitlyConvertible { operator U(const T&); }

Boost.Generic: Concepts without Concepts

69/98

© 2011 Matt Calabrese

Creating Concepts Conversion Operation Requirements auto concept ExplicitlyConvertible { explicit operator U(const T&); } auto concept Convertible : ExplicitlyConvertible { operator U(const T&); } BOOST_GENERIC_AUTO_CONCEPT ( (ExplicitlyConvertible)( (typename) T, (typename) U ) , ( explicit (operator U)( (const T&) ) ) ) BOOST_GENERIC_AUTO_CONCEPT ( (Convertible)( (typename) T, (typename) U ) , ( public ExplicitlyConvertible ) , ( (operator U)( (const T&) ) ) )

Boost.Generic: Concepts without Concepts

70/98

© 2011 Matt Calabrese

Creating Concepts More Complicated than It Looks auto concept HasDereference { typename result_type; result_type operator*(T&); result_type operator*(T&&); }

Boost.Generic: Concepts without Concepts

71/98

© 2011 Matt Calabrese

Creating Concepts More Complicated than It Looks auto concept HasDereference { typename result_type; result_type operator*(T&); result_type operator*(T&&); }

Boost.Generic: Concepts without Concepts

72/98

© 2011 Matt Calabrese

Creating Concepts More Complicated than It Looks auto concept HasDereference { typename result_type; result_type operator*(T&); result_type operator*(T&&); } BOOST_GENERIC_AUTO_CONCEPT ( (HasDereference)( (typename) T ) , ( typename result_type ) , ( (result_type)(operator dereference)(T&) ) , ( (result_type)(operator dereference)(T&&) ) )

Boost.Generic: Concepts without Concepts

73/98

© 2011 Matt Calabrese

Creating Concepts Concept Value Parameters concept True {} concept_map True {} auto concept IsEven { requires True; }

Boost.Generic: Concepts without Concepts

74/98

© 2011 Matt Calabrese

Creating Concepts Concept Value Parameters concept True {} concept_map True {} auto concept IsEven { requires True; } BOOST_GENERIC_CONCEPT( (True)( (bool) V ) ) … BOOST_GENERIC_AUTO_CONCEPT ( (IsEven)( (bool) V ) , ( requires True ) )

Boost.Generic: Concepts without Concepts

75/98

© 2011 Matt Calabrese

Creating Concepts Refinement and Axioms auto concept CopyConstructible : MoveConstructible, Constructible { axiom CopyPreservation(T x) { T(x) == x; } }

Boost.Generic: Concepts without Concepts

76/98

© 2011 Matt Calabrese

Creating Concepts Refinement and Axioms auto concept CopyConstructible : MoveConstructible, Constructible { axiom CopyPreservation(T x) { T(x) == x; } } BOOST_GENERIC_AUTO_CONCEPT ( (CopyConstructible)( (typename) T ) , ( public MoveConstructible, Constructible1 ) , ( axiom CopyPreservation(T x) {

T(x) == x; } ) ) Boost.Generic: Concepts without Concepts

77/98

© 2011 Matt Calabrese

Creating Concepts Everybody's favorite concepts... Iterators (N2914)!!! concept Iterator : Semiregular { MoveConstructible reference = typename X::reference; MoveConstructible postincrement_result; requires HasDereference; reference operator*(X&); reference operator*(X&&); X& operator++(X&); postincrement_result operator++(X&, int); }

Boost.Generic: Concepts without Concepts

78/98

© 2011 Matt Calabrese

Creating Concepts Everybody's favorite concepts... Iterators (N2914)!!! concept Iterator : Semiregular { MoveConstructible reference = typename X::reference; MoveConstructible postincrement_result; requires HasDereference; reference operator*(X&); reference operator*(X&&); X& operator++(X&); postincrement_result operator++(X&, int); } BOOST_GENERIC_CONCEPT ( (Iterator)( (typename) X ), ( public Semiregular ) , ( (MoveConstructible) reference, typename X::reference ) , ( (MoveConstructible) postincrement_result ) , ( requires HasDereference ) , ( (reference)(operator dereference)( (X&) ) ) , ( (reference)(operator dereference)( (X&&) ) ) , ( (X&)(operator preincrement)( (X&) ) ) , ( (postincrement_result)(operator postincrement)( (X&), (int) ) ) )

Boost.Generic: Concepts without Concepts

79/98

© 2011 Matt Calabrese

Creating Concepts Everybody's favorite concepts... Iterators (N2914)!!! concept Iterator : Semiregular { MoveConstructible reference = typename X::reference; MoveConstructible postincrement_result; requires HasDereference; reference operator*(X&); reference operator*(X&&); X& operator++(X&); postincrement_result operator++(X&, int); } BOOST_GENERIC_CONCEPT ( (Iterator)( (typename) X ), ( public Semiregular ) , ( (MoveConstructible) reference, typename X::reference ) , ( (MoveConstructible) postincrement_result ) , ( requires HasDereference ) , ( (reference)(operator dereference)( (X&) ) ) , ( (reference)(operator dereference)( (X&&) ) ) , ( (X&)(operator preincrement)( (X&) ) ) , ( (postincrement_result)(operator postincrement)( (X&), (int) ) ) )

Boost.Generic: Concepts without Concepts

80/98

© 2011 Matt Calabrese

Creating Concepts Everybody's favorite concepts... Iterators (N2914)!!! concept Iterator : Semiregular { MoveConstructible reference = typename X::reference; MoveConstructible postincrement_result; requires HasDereference; reference operator*(X&); reference operator*(X&&); X& operator++(X&); postincrement_result operator++(X&, int); } BOOST_GENERIC_CONCEPT ( (Iterator)( (typename) X ), ( public Semiregular ) , ( (MoveConstructible) reference, typename X::reference ) , ( (MoveConstructible) postincrement_result ) , ( requires HasDereference ) , ( (reference)(operator dereference)( (X&) ) ) , ( (reference)(operator dereference)( (X&&) ) ) , ( (X&)(operator preincrement)( (X&) ) ) , ( (postincrement_result)(operator postincrement)( (X&), (int) ) ) )

Boost.Generic: Concepts without Concepts

81/98

© 2011 Matt Calabrese

Creating Concepts Everybody's favorite concepts... Iterators (N2914)!!! concept Iterator : Semiregular { MoveConstructible reference = typename X::reference; MoveConstructible postincrement_result; requires HasDereference; reference operator*(X&); reference operator*(X&&); X& operator++(X&); postincrement_result operator++(X&, int); } BOOST_GENERIC_CONCEPT ( (Iterator)( (typename) X ), ( public Semiregular ) , ( (MoveConstructible) reference, typename X::reference ) , ( (MoveConstructible) postincrement_result ) , ( requires HasDereference ) , ( (reference)(operator dereference)( (X&) ) ) , ( (reference)(operator dereference)( (X&&) ) ) , ( (X&)(operator preincrement)( (X&) ) ) , ( (postincrement_result)(operator postincrement)( (X&), (int) ) ) )

Boost.Generic: Concepts without Concepts

82/98

© 2011 Matt Calabrese

Creating Concepts Everybody's favorite concepts... Iterators (N2914)!!! concept Iterator : Semiregular { MoveConstructible reference = typename X::reference; MoveConstructible postincrement_result; requires HasDereference; reference operator*(X&); reference operator*(X&&); X& operator++(X&); postincrement_result operator++(X&, int); } BOOST_GENERIC_CONCEPT ( (Iterator)( (typename) X ), ( public Semiregular ) , ( (MoveConstructible) reference, typename X::reference ) , ( (MoveConstructible) postincrement_result ) , ( requires HasDereference ) , ( (reference)(operator dereference)( (X&) ) ) , ( (reference)(operator dereference)( (X&&) ) ) , ( (X&)(operator preincrement)( (X&) ) ) , ( (postincrement_result)(operator postincrement)( (X&), (int) ) ) )

Boost.Generic: Concepts without Concepts

83/98

© 2011 Matt Calabrese

Creating Concepts Everybody's favorite concepts... Iterators (N2914)!!! concept Iterator : Semiregular { MoveConstructible reference = typename X::reference; MoveConstructible postincrement_result; requires HasDereference; reference operator*(X&); reference operator*(X&&); X& operator++(X&); postincrement_result operator++(X&, int); } BOOST_GENERIC_CONCEPT ( (Iterator)( (typename) X ), ( public Semiregular ) , ( (MoveConstructible) reference, typename X::reference ) , ( (MoveConstructible) postincrement_result ) , ( requires HasDereference ) , ( (reference)(operator dereference)( (X&) ) ) , ( (reference)(operator dereference)( (X&&) ) ) , ( (X&)(operator preincrement)( (X&) ) ) , ( (postincrement_result)(operator postincrement)( (X&), (int) ) ) )

Boost.Generic: Concepts without Concepts

84/98

© 2011 Matt Calabrese

Creating Concepts Everybody's favorite concepts... Iterators (N2914)!!! concept Iterator : Semiregular { MoveConstructible reference = typename X::reference; MoveConstructible postincrement_result; requires HasDereference; reference operator*(X&); reference operator*(X&&); X& operator++(X&); postincrement_result operator++(X&, int); } BOOST_GENERIC_CONCEPT ( (Iterator)( (typename) X ), ( public Semiregular ) , ( (MoveConstructible) reference, typename X::reference ) , ( (MoveConstructible) postincrement_result ) , ( requires HasDereference ) , ( (reference)(operator dereference)( (X&) ) ) , ( (reference)(operator dereference)( (X&&) ) ) , ( (X&)(operator preincrement)( (X&) ) ) , ( (postincrement_result)(operator postincrement)( (X&), (int) ) ) )

Boost.Generic: Concepts without Concepts

85/98

© 2011 Matt Calabrese

Creating Concepts Everybody's favorite concepts... Iterators (N2914)!!! concept Iterator : Semiregular { MoveConstructible reference = typename X::reference; MoveConstructible postincrement_result; requires HasDereference; reference operator*(X&); reference operator*(X&&); X& operator++(X&); postincrement_result operator++(X&, int); } BOOST_GENERIC_CONCEPT ( (Iterator)( (typename) X ), ( public Semiregular ) , ( (MoveConstructible) reference, typename X::reference ) , ( (MoveConstructible) postincrement_result ) , ( requires HasDereference ) , ( (reference)(operator dereference)( (X&) ) ) , ( (reference)(operator dereference)( (X&&) ) ) , ( (X&)(operator preincrement)( (X&) ) ) , ( (postincrement_result)(operator postincrement)( (X&), (int) ) ) )

Boost.Generic: Concepts without Concepts

86/98

© 2011 Matt Calabrese

Creating Concepts Everybody's favorite concepts... Iterators (N2914)!!! concept Iterator : Semiregular { MoveConstructible reference = typename X::reference; MoveConstructible postincrement_result; requires HasDereference; reference operator*(X&); reference operator*(X&&); X& operator++(X&); postincrement_result operator++(X&, int); } BOOST_GENERIC_CONCEPT ( (Iterator)( (typename) X ), ( public Semiregular ) , ( (MoveConstructible) reference, typename X::reference ) , ( (MoveConstructible) postincrement_result ) , ( requires HasDereference ) , ( (reference)(operator dereference)( (X&) ) ) , ( (reference)(operator dereference)( (X&&) ) ) , ( (X&)(operator preincrement)( (X&) ) ) , ( (postincrement_result)(operator postincrement)( (X&), (int) ) ) )

Boost.Generic: Concepts without Concepts

87/98

© 2011 Matt Calabrese

Creating Concepts Everybody's favorite concepts... Iterators (N2914)!!! concept Iterator : Semiregular { MoveConstructible reference = typename X::reference; MoveConstructible postincrement_result; requires HasDereference; reference operator*(X&); reference operator*(X&&); X& operator++(X&); postincrement_result operator++(X&, int); } BOOST_GENERIC_CONCEPT ( (Iterator)( (typename) X ), ( public Semiregular ) , ( (MoveConstructible) reference, typename X::reference ) , ( (MoveConstructible) postincrement_result ) , ( requires HasDereference ) , ( (reference)(operator dereference)( (X&) ) ) , ( (reference)(operator dereference)( (X&&) ) ) , ( (X&)(operator preincrement)( (X&) ) ) , ( (postincrement_result)(operator postincrement)( (X&), (int) ) ) )

Boost.Generic: Concepts without Concepts

88/98

© 2011 Matt Calabrese

Creating Concepts Skip ahead to RandomAccessIterators... concept RandomAccessIterator : BidirectionalIterator, LessThanComparable { MoveConstructible subscript_reference; requires Convertible; X& operator+=(X&, difference_type); X operator+ (const X& x, difference_type n) { X tmp(x); tmp += n; return tmp; } X operator+ (difference_type n, const X& x) { X tmp(x); tmp += n; return tmp; } X& operator-=(X&, difference_type); X operator- (const X& x, difference_type n) { X tmp(x); tmp -= n; return tmp; } difference_type operator-(const X&, const X&); subscript_reference operator[](const X& x, difference_type n); }

I hope you like parentheses.

Boost.Generic: Concepts without Concepts

89/98

© 2011 Matt Calabrese

Creating Concepts Skip ahead to RandomAccessIterators... concept RandomAccessIterator : BidirectionalIterator, LessThanComparable { MoveConstructible subscript_reference; requires Convertible; X& operator+=(X&, difference_type); X operator+ (const X& x, difference_type n) { X tmp(x); tmp += n; return tmp; } X operator+ (difference_type n, const X& x) { X tmp(x); tmp += n; return tmp; } X& operator-=(X&, difference_type); X operator- (const X& x, difference_type n) { X tmp(x); tmp -= n; return tmp; } difference_type operator-(const X&, const X&); subscript_reference operator[](const X& x, difference_type n); } BOOST_GENERIC_CONCEPT ( (RandomAccessIterator)( (typename) X ), ( public BidirectionalIterator, LessThanComparable ) , ( (MoveConstructible) subscript_reference ) , ( requires Convertible::value_type&> ) , ( (X&)(operator plus_assign)( (X&), (typename BidirectionalIterator::difference_type ) ) ) , ( (X)(operator plus)( (const X&) x, (typename BidirectionalIterator::difference_type) n ) ) , ( (X)(operator plus)( (typename BidirectionalIterator::difference_type) n, (const X&) x ) ) , ( (X&)(operator minus_assign)( (X&), (typename BidirectionalIterator::difference_type) ) ) , ( (X)(operator minus)( (const X&) x, (typename BidirectionalIterator::difference_type) n ) ) , ( (difference_type)(operator minus)( (const X&), (const X&) ) ) , ( (subscript_reference)(operator subscript)( (const X&), (typename BidirectionalIterator::difference_type) ) ) )

Boost.Generic: Concepts without Concepts

90/98

© 2011 Matt Calabrese

Creating Concepts Skip ahead to RandomAccessIterators... concept RandomAccessIterator : BidirectionalIterator, LessThanComparable { MoveConstructible subscript_reference; requires Convertible; X& operator+=(X&, difference_type); X operator+ (const X& x, difference_type n) { X tmp(x); tmp += n; return tmp; } X operator+ (difference_type n, const X& x) { X tmp(x); tmp += n; return tmp; } X& operator-=(X&, difference_type); X operator- (const X& x, difference_type n) { X tmp(x); tmp -= n; return tmp; } difference_type operator-(const X&, const X&); subscript_reference operator[](const X& x, difference_type n); } BOOST_GENERIC_CONCEPT ( (RandomAccessIterator)( (typename) X ), ( public BidirectionalIterator, LessThanComparable ) , ( (MoveConstructible) subscript_reference ) , ( requires Convertible::value_type&> ) , ( (X&)(operator plus_assign)( (X&), (typename BidirectionalIterator::difference_type ) ) ) , ( (X)(operator plus)( (const X&) x, (typename BidirectionalIterator::difference_type) n ) ) , ( (X)(operator plus)( (typename BidirectionalIterator::difference_type) n, (const X&) x ) ) , ( (X&)(operator minus_assign)( (X&), (typename BidirectionalIterator::difference_type) ) ) , ( (X)(operator minus)( (const X&) x, (typename BidirectionalIterator::difference_type) n ) ) , ( (difference_type)(operator minus)( (const X&), (const X&) ) ) , ( (subscript_reference)(operator subscript)( (const X&), (typename BidirectionalIterator::difference_type) ) ) )

Boost.Generic: Concepts without Concepts

91/98

© 2011 Matt Calabrese

Creating Concepts Skip ahead to RandomAccessIterators... concept RandomAccessIterator : BidirectionalIterator, LessThanComparable { MoveConstructible subscript_reference; requires Convertible; X& operator+=(X&, difference_type); X operator+ (const X& x, difference_type n) { X tmp(x); tmp += n; return tmp; } X operator+ (difference_type n, const X& x) { X tmp(x); tmp += n; return tmp; } X& operator-=(X&, difference_type); X operator- (const X& x, difference_type n) { X tmp(x); tmp -= n; return tmp; } difference_type operator-(const X&, const X&); subscript_reference operator[](const X& x, difference_type n); } BOOST_GENERIC_CONCEPT ( (RandomAccessIterator)( (typename) X ), ( public BidirectionalIterator, LessThanComparable ) , ( (MoveConstructible) subscript_reference ) , ( requires Convertible::value_type&> ) , ( (X&)(operator plus_assign)( (X&), (typename BidirectionalIterator::difference_type ) ) ) , ( (X)(operator plus)( (const X&) x, (typename BidirectionalIterator::difference_type) n ) ) , ( (X)(operator plus)( (typename BidirectionalIterator::difference_type) n, (const X&) x ) ) , ( (X&)(operator minus_assign)( (X&), (typename BidirectionalIterator::difference_type) ) ) , ( (X)(operator minus)( (const X&) x, (typename BidirectionalIterator::difference_type) n ) ) , ( (difference_type)(operator minus)( (const X&), (const X&) ) ) , ( (subscript_reference)(operator subscript)( (const X&), (typename BidirectionalIterator::difference_type) ) ) )

Boost.Generic: Concepts without Concepts

92/98

© 2011 Matt Calabrese

Creating Concept Maps

The Hard Part Is Over

Boost.Generic: Concepts without Concepts

93/98

© 2011 Matt Calabrese

Creating Concept Maps Pointers as RandomAccessIterators template concept_map RandomAccessIterator { typedef T value_type; typedef ptrdiff_t difference_type; typedef T& reference; typedef T* pointer; }

Boost.Generic: Concepts without Concepts

94/98

© 2011 Matt Calabrese

Creating Concept Maps Pointers as RandomAccessIterators template concept_map RandomAccessIterator { typedef T value_type; typedef ptrdiff_t difference_type; typedef T& reference; typedef T* pointer; }

BOOST_GENERIC_CONCEPT_MAP ( ( template ( (class) T ) ), (RandomAccessIterator)(T*) , ( typedef T value_type ) , ( typedef ptrdiff_t difference_type ) , ( typedef T& reference ) , ( typedef T* pointer ) )

Boost.Generic: Concepts without Concepts

95/98

© 2011 Matt Calabrese

Creating Concept Maps Pointers as RandomAccessIterators template concept_map RandomAccessIterator { typedef T value_type; typedef ptrdiff_t difference_type; typedef T& reference; typedef T* pointer; }

BOOST_GENERIC_CONCEPT_MAP ( ( template ( (class) T ) ), (RandomAccessIterator)(T*) , ( typedef T value_type ) , ( typedef ptrdiff_t difference_type ) , ( typedef T& reference ) , ( typedef T* pointer ) )

Boost.Generic: Concepts without Concepts

96/98

© 2011 Matt Calabrese

Future Direction Automatically Generate Archetypes Improve Preprocessor Error Detection Create Quickbook Documentation Start Testing on Clang Add Type-Template Requirements Parse Variadic Concepts Allow Ref-Qualifiers on Member-Function Requirements Finish Implementing the Concepts of N2914 Do Basic Syntax Checking on Axioms Optimize Preprocessing Make a Backend Targeting ConceptGCC and ConceptClang Get Boost.Generic Reviewed and [Hopefully] into Boost Create Concepts for BGL, Boost.GIL and other Boost Libraries Automatic Creation of Type Erasure Constructs (I.e. Boost.Any, Boost.Function)

Boost.Generic: Concepts without Concepts

97/98

© 2011 Matt Calabrese

Questions

Boost.Generic: Concepts without Concepts

98/98

© 2011 Matt Calabrese

Boost.Generic: Concepts without Concepts - GitHub

You Tell Me ... auto operator -( L lhs, R rhs ) -> decltype( lhs + -rhs ) ... In these tables, T is an object or reference type to be supplied by a C++ program.

313KB Sizes 2 Downloads 259 Views

Recommend Documents

Concepts in Crypto - GitHub
to check your email. ○. Enigmail: Thunderbird addon that adds OpenPGP ... you its certificate, which includes its public key ... iOS, Android: ChatSecure ...

lecture 10: advanced bayesian concepts - GitHub
some probability distribution function (PDF) of perfect data x, but what we measure is d, a noisy version of x, and noise is ... We can also try to marginalize over x analytically: convolve true PDF with noise PDF and do this for each ... We would li

Concepts of Ordinary Differential Equations Kris Kissel - GitHub
41. Chapter 4. First Order Linear Equations. 53. Chapter 5. Taylor Solutions. 63. Focus on Modeling: Pendulums. 72. Chapter 6. Existence and Uniqueness. 75. Part 2. Second ... by students (in particular, the material on matrices and separation of var

Formulæ for concepts that Tom is drawing - GitHub
Mar 22, 2014 - As matrix arithmetic, it's the diagonal of the covariance because those are the cells where we're multiplying the the same x. diag (Σ). In R, all of ...

Fundamental Concepts of Computer Science (working title) - GitHub
Sep 29, 2007 - Fundamental Concepts of Computer Science. (working title) ... For a single-quarter course, the chapter on set theory can be given cursory treatment while the ..... boolean function SubsetSum( list of naturals N, integer m ).

Concepts Lite - Programming Generically
auto si = find(s, 7); // calls associative container overload. At each call site, the compiler checks the requirements of each overload to determine which should be ...

solutions to concepts - PlusTwoPhysics
May 18, 1992 - Given momentum of electron = 1.4 × 10–26kg m/sec .... (V′ is the change is velocity of the platform when platform itself is taken as reference ...

Misc Concepts
is the socialization their best friend gets. When dogs interact, they learn from each other, and become calmer and more good natured. In this design, a big dog and a little dog meet nose-to-nose, both looking relaxed and happy to see each other. The

concepts & synthesis
Schematic relationship of seed production per flower to pollen delivery by .... primarily because of variation in pollinator service. Thus ..... Edge effects on flower-.

Electricity Companies - Elite Concepts
Capital/ Service Line Contributions Received by Electricity Companies: ... of electricity distribution reforms in light of existing poor distribution network, huge.

Concepts Lite - Programming Generically
College Station, Texas 77843. 1 Introduction .... the resolution algoritm picks the unique best overload if one exists, otherwise a call is an error. ...... ISO/IEC JTC 1, Information Technology Subcommittee SC 22, Program- ming Language C++, ...

concepts
Homeland Security Presidential Directive-21.13 With ... Department of Homeland Security provides a useful con- ...... endpoint, and these competen- cies must ...

Cardiovascular physiology concepts www.emchweb.com.pdf ...
Page 1 of 253. LEARNING OBJECTIVES. THE NEED FOR A CIRCULATORY SYSTEM. THE ARRANGEMENT OF THE. CARDIOVASCULAR SYSTEM.

Word meaning, concepts and Word meaning, concepts ...
pragmatics, concepts have come to play a prominent role, although not much work ..... I start by outlining the linguistic underdeterminacy thesis, which holds that in ...... So the contents of mind-internal concepts like DOG, COFFEE, WATER, ...... 'r

Information Literacy Concepts
A fully editable copy of this resource is available under the above license at: .... to have a business librarian, a STEM librarian, and so on. ... others may require a small fee. ... Because so much information can be found online, and not.

Information Literacy Concepts
public service role, but they make up a big part of staff in any large .... only in school, but also in our daily lives. Just as ... Quality information sources will cite their statistical data .... science reporter on cable news, but these sources a

Electricity Companies - Elite Concepts
Accounting for Security Deposits received by Electricity Supply Companies: .... Power House Electricity Company Ltd incurring losses has received ` 10 lakhs as ..... Software. Capital Work–in–Progress. Contingency Reserve Investments ...

Concepts Lite - Programming Generically
College Station, Texas 77843. 1 Introduction. In this paper, we ...... aemantic Aspects of C++ Concepts Technical Report N3351=09-0077,. ISO/IEC JTC 1, ...

concepts & synthesis
We briefly illustrate the distinction between these two components of pollen limitation with results from ..... Reanalysis of data collected during 1996 (see Aizen 2005) demon- ..... Analysis and Synthesis, a Center funded by NSF (Grant number ...

Cardiovascular physiology concepts www.emchweb.com.pdf ...
drains into the hepatic portal system to supply. the liver. The liver also receives blood from the. aorta via the hepatic artery. Therefore, most of. the liver circulation ...