# Modern C++ Programming #
## C++11/C++14/C++17 ##

### Essential Tool ###

Online compiler and execution: [CompilerExplorer](https://godbolt.org/)

* for code execution: [Add new..] -> [execution only] 

## TOPICS ##

**[1. Introduction](https://github.com/federico-busato/Modern-CPP-Programming/blob/master/01.Introduction.pdf)**

* A Little History of C/C++ Programming Languages
* C++ Philosophy
* Why C++?
* Course Overview and References
* Who I Am

**[2. Basic Concepts I](https://github.com/federico-busato/Modern-CPP-Programming/blob/master/02.Basic_Concepts_I.pdf)**

* Prerequirements: Compiler, editor, etc.
* Hello World
* C++ Primitive Types
* Integral Data Types
* Floating-point Arithmetic
* Floating-point Issues

**[3. Basic Concepts II](https://github.com/federico-busato/Modern-CPP-Programming/blob/master/03.Basic_Concepts_II.pdf)**

* Enumerators
* `union` and Bitfield
* `using`, `decltype`, and `auto`
* Math Operators
* Statements and Control Flow

**[4. Basic Concepts III](https://github.com/federico-busato/Modern-CPP-Programming/blob/master/04.Basic_Concepts_III.pdf)**

* Memory Management: Heap and Stack
* Initialization
* Pointers and References
* `sizeof` Operator
* `const` and `constexpr`
* Explicit Type Conversion

**[5. Basic Concepts IV](https://github.com/federico-busato/Modern-CPP-Programming/blob/master/05.Basic_Concepts_IV.pdf)**

* Declaration and Definition
* Functions
* Preprocessing

**[6. Utilities](https://github.com/federico-busato/Modern-CPP-Programming/blob/master/06.Utilities.pdf)**

* I/O Stream
* Filesystem Library
* Math Functions
* Algorithm Library
* `std::string` and `std::string_view`
* Random Numbers
* Time Measuring

**[7. C++ Object Oriented Programming I](https://github.com/federico-busato/Modern-CPP-Programming/blob/master/07.Object_Oriented_I.pdf)**

* C++ Classes
* Class Constructor
* Copy Construcor
* Class Destructor
* Initialization and Defaulted Members
* Class Keywords

**[8. C++ Object Oriented Programming II](https://github.com/federico-busato/Modern-CPP-Programming/blob/master/08.Object_Oriented_II.pdf)**

* Polymorphism
* Operator overloading
* Special Objects

**[9. C++ Templates and Meta-programming I](https://github.com/federico-busato/Modern-CPP-Programming/blob/master/09.Templates_I.pdf)**

* Function Templates
* Compile-Time Utilities
* Type Traits
* Template Parameters

**[10. C++ Templates and Meta-programming II](https://github.com/federico-busato/Modern-CPP-Programming/blob/master/10.Templates_II.pdf)**

* Class Templates
* Template Meta-Programming
* SFINAE: Substitution Failure Is Not An Error
* Variadic Template
* STD Template Utility

**[11. Containers, Iterators, and Algorithms](https://github.com/federico-busato/Modern-CPP-Programming/blob/master/11.Iterators_Containers_Alg.pdf)**

* Containers and Iterators
* Sequence Containers: `array`, `vector`, `list`, `deque`, `forward_list`
* Associative Containers: `set`, `map`
* Container Adaptors: `stack`, `queue`, `priority_queue`
* Implement a Custom Iterator
* Iterator Utility Methods
* Algorithms Library
* Lambda Expressions

**[12. Translation Units](https://github.com/federico-busato/Modern-CPP-Programming/blob/master/12.Translation_Units.pdf)**

* Basic Concepts
* Linkage
* Variables Storage
* Function Template
* Class Template
* Undefined Behavior and Summary
* `#include` Issues
* Namespace
* How to Compile: static and dynamic libraries

**[13. Code Conventions](https://github.com/federico-busato/Modern-CPP-Programming/blob/master/13.Code_Convention.pdf)**

* C++ Project Organization
* Coding Styles and Conventions
* `#include` and `namespace`
* Variables and Prepossessing
* Functions and Classes
* Modern C++ Features
* Control Flow
* Naming and Formatting

**[14. Ecosystem](https://github.com/federico-busato/Modern-CPP-Programming/blob/master/14.Ecosystem.pdf)**

* Execution Debugging: `gdb` and `assert`
* Memory Debugging: `valgrind`
* Sanitizers: `address`, `leak`, `memory`, `undefined behavior`
* Debugging Summary
* CMake
* Code Checking and Analysis: `warnings` and `static analyzers`
* Code Quality: `linters`
* Code Testing: `unit test`, `coverage`
* Code Commenting: `doxygen`
* Code Statistics: `lines count`, `cyclomatic complexity`
* Other Tools: code `formating`, `exploring`, `benchmarking`

**[15. Advanced Topics](https://github.com/federico-busato/Modern-CPP-Programming/blob/master/15.Advanced_Topics.pdf)**

* Move Semantic
* Copy Elision and RVO
* Type deduction
* C++ Idioms: `rule of zero/three/five`, `singleton`, `PILP`, `CRTP`
* Smart Pointers
* Concurrency: `std::thread`

**[16. Optimization I](https://github.com/federico-busato/Modern-CPP-Programming/blob/master/16.Optimization_I.pdf)**

* General Concepts: asymptotic complexity, optimization cycle, Ahmdal Law, etc.
* I/O Operations
* Locality and Memory Access Patterns
* Arithmetic
* Control Flow
* Functions
* C++ Objects

**[17. Optimization II](https://github.com/federico-busato/Modern-CPP-Programming/blob/master/17.Optimization_II.pdf)**

* Compiler Optimizations
* Libraries and Data Structures
* Profiling
* Parallel Computing

### Reporting bugs and contributing ###

If you find any typos, conceptual errors, or sections to improve, please report them by writing directly to me or by using the `issue` panel

## Author ##

* `Federico Busato`,<br/>
Nvidia Corporation ([fbusato@nvidia.com](mailto:fbusato@nvidia.com))<br/>
Dept. of Computer Science, University of Verona (Italy) [federico.busato@univr.it](mailto:federico.busato@univr.it)

## License ##

> BSD 3-Clause License
>
> Copyright (c) 2020, Modern C++ Programming
> All rights reserved.
>
> Redistribution and use in source and binary forms, with or without
> modification, are permitted provided that the following conditions are met:
>
> * Redistributions of source code must retain the above copyright notice, this
>   list of conditions and the following disclaimer.
>
> * Redistributions in binary form must reproduce the above copyright notice,
>   this list of conditions and the following disclaimer in the documentation
>   and/or other materials provided with the distribution.
>
> * Neither the name of the copyright holder nor the names of its
>   contributors may be used to endorse or promote products derived from
>   this software without specific prior written permission.
>
> THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
> AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
> DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
> FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
> SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
> CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
> OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
> OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
