Clean Integral Codemeetingcpp.com/mcpp/slides/2018/Clean Integral Code.pdf · Clean Code Integers...
Transcript of Clean Integral Codemeetingcpp.com/mcpp/slides/2018/Clean Integral Code.pdf · Clean Code Integers...
![Page 1: Clean Integral Codemeetingcpp.com/mcpp/slides/2018/Clean Integral Code.pdf · Clean Code Integers Quiz" You need t o l ear n t he w hol e l anguage. "Kate Gregory @Meeting C++ 2017](https://reader036.fdocuments.us/reader036/viewer/2022063022/5fe6e460600380430316c375/html5/thumbnails/1.jpg)
Clean Integral Code
Walther Zwart - Meeting C++ 2018
![Page 2: Clean Integral Codemeetingcpp.com/mcpp/slides/2018/Clean Integral Code.pdf · Clean Code Integers Quiz" You need t o l ear n t he w hol e l anguage. "Kate Gregory @Meeting C++ 2017](https://reader036.fdocuments.us/reader036/viewer/2022063022/5fe6e460600380430316c375/html5/thumbnails/2.jpg)
About me [email protected]
> 30 years of programming
20 years of C++
3rd time at MeetingCPP
5 years at Optiver
![Page 3: Clean Integral Codemeetingcpp.com/mcpp/slides/2018/Clean Integral Code.pdf · Clean Code Integers Quiz" You need t o l ear n t he w hol e l anguage. "Kate Gregory @Meeting C++ 2017](https://reader036.fdocuments.us/reader036/viewer/2022063022/5fe6e460600380430316c375/html5/thumbnails/3.jpg)
About me
About Optiver
Market Maker since 1986
Amsterdam, Sydney, Chicago, Shanghai
440 people, 44 nationalities in Amsterdam
Low-latency C++ workshop with David Gross during C++ on Sea 2019
![Page 4: Clean Integral Codemeetingcpp.com/mcpp/slides/2018/Clean Integral Code.pdf · Clean Code Integers Quiz" You need t o l ear n t he w hol e l anguage. "Kate Gregory @Meeting C++ 2017](https://reader036.fdocuments.us/reader036/viewer/2022063022/5fe6e460600380430316c375/html5/thumbnails/4.jpg)
About me
About Optiver
Clean Code"Have nothing in your houses that you do not know
to be useful or believe to be beautiful."
William Morris
"It is not enough for code to work."
Robert C. Martin
![Page 5: Clean Integral Codemeetingcpp.com/mcpp/slides/2018/Clean Integral Code.pdf · Clean Code Integers Quiz" You need t o l ear n t he w hol e l anguage. "Kate Gregory @Meeting C++ 2017](https://reader036.fdocuments.us/reader036/viewer/2022063022/5fe6e460600380430316c375/html5/thumbnails/5.jpg)
About me
About Optiver
Clean Code
Integers
"I thought I was a C++ expert, but I can't evenremember the rules about integer promotion."
"What is integer promotion?"
![Page 6: Clean Integral Codemeetingcpp.com/mcpp/slides/2018/Clean Integral Code.pdf · Clean Code Integers Quiz" You need t o l ear n t he w hol e l anguage. "Kate Gregory @Meeting C++ 2017](https://reader036.fdocuments.us/reader036/viewer/2022063022/5fe6e460600380430316c375/html5/thumbnails/6.jpg)
About me
About Optiver
Clean Code
Integers
Quiz
![Page 7: Clean Integral Codemeetingcpp.com/mcpp/slides/2018/Clean Integral Code.pdf · Clean Code Integers Quiz" You need t o l ear n t he w hol e l anguage. "Kate Gregory @Meeting C++ 2017](https://reader036.fdocuments.us/reader036/viewer/2022063022/5fe6e460600380430316c375/html5/thumbnails/7.jpg)
1. How many (real) integer types are there in C++17?1. 42. 83. 154. 45
![Page 8: Clean Integral Codemeetingcpp.com/mcpp/slides/2018/Clean Integral Code.pdf · Clean Code Integers Quiz" You need t o l ear n t he w hol e l anguage. "Kate Gregory @Meeting C++ 2017](https://reader036.fdocuments.us/reader036/viewer/2022063022/5fe6e460600380430316c375/html5/thumbnails/8.jpg)
1. How many (real) integer types are there in C++17?1. 42. 83. 154. 45
Answer: C
![Page 9: Clean Integral Codemeetingcpp.com/mcpp/slides/2018/Clean Integral Code.pdf · Clean Code Integers Quiz" You need t o l ear n t he w hol e l anguage. "Kate Gregory @Meeting C++ 2017](https://reader036.fdocuments.us/reader036/viewer/2022063022/5fe6e460600380430316c375/html5/thumbnails/9.jpg)
2. Considering std::uint8_t a{255}; ++a;
What will happen?1. overflow2. just math3. implementation defined behaviour4. undefined behaviour
![Page 10: Clean Integral Codemeetingcpp.com/mcpp/slides/2018/Clean Integral Code.pdf · Clean Code Integers Quiz" You need t o l ear n t he w hol e l anguage. "Kate Gregory @Meeting C++ 2017](https://reader036.fdocuments.us/reader036/viewer/2022063022/5fe6e460600380430316c375/html5/thumbnails/10.jpg)
2. Considering std::uint8_t a{255}; ++a;
What will happen?1. overflow2. just math3. implementation defined behaviour4. undefined behaviour
Answer: B, math: a == 0The C++ standards specifically says: no overflow.
Just regular, every day, modulo 2n math
![Page 11: Clean Integral Codemeetingcpp.com/mcpp/slides/2018/Clean Integral Code.pdf · Clean Code Integers Quiz" You need t o l ear n t he w hol e l anguage. "Kate Gregory @Meeting C++ 2017](https://reader036.fdocuments.us/reader036/viewer/2022063022/5fe6e460600380430316c375/html5/thumbnails/11.jpg)
3. Considering std::int8_t a{127}; ++a;
What will happen?1. overflow2. nothing, just regular math3. implementation defined behaviour4. undefined behaviour
![Page 12: Clean Integral Codemeetingcpp.com/mcpp/slides/2018/Clean Integral Code.pdf · Clean Code Integers Quiz" You need t o l ear n t he w hol e l anguage. "Kate Gregory @Meeting C++ 2017](https://reader036.fdocuments.us/reader036/viewer/2022063022/5fe6e460600380430316c375/html5/thumbnails/12.jpg)
3. Considering std::int8_t a{127}; ++a;
What will happen?1. overflow2. nothing, just regular math3. implementation defined behaviour4. undefined behaviour
Answer: unde�ned behaviour
![Page 13: Clean Integral Codemeetingcpp.com/mcpp/slides/2018/Clean Integral Code.pdf · Clean Code Integers Quiz" You need t o l ear n t he w hol e l anguage. "Kate Gregory @Meeting C++ 2017](https://reader036.fdocuments.us/reader036/viewer/2022063022/5fe6e460600380430316c375/html5/thumbnails/13.jpg)
4. Considering std::int8_t a = std::int8_t(127) + std::int8_t(1);
What will happen?1. overflow, a == -1282. conversion, a == -1283. implementation defined behaviour4. undefined behaviour
![Page 14: Clean Integral Codemeetingcpp.com/mcpp/slides/2018/Clean Integral Code.pdf · Clean Code Integers Quiz" You need t o l ear n t he w hol e l anguage. "Kate Gregory @Meeting C++ 2017](https://reader036.fdocuments.us/reader036/viewer/2022063022/5fe6e460600380430316c375/html5/thumbnails/14.jpg)
4. Considering std::int8_t a = std::int8_t(127) + std::int8_t(1);
What will happen?1. overflow, a == -1282. conversion, a == -1283. implementation defined behaviour4. undefined behaviour
Answer: implementation de�ned behaviour
![Page 15: Clean Integral Codemeetingcpp.com/mcpp/slides/2018/Clean Integral Code.pdf · Clean Code Integers Quiz" You need t o l ear n t he w hol e l anguage. "Kate Gregory @Meeting C++ 2017](https://reader036.fdocuments.us/reader036/viewer/2022063022/5fe6e460600380430316c375/html5/thumbnails/15.jpg)
5. Considering auto a = 'A' + static_cast<bool>(2);
What is the value and type of a?1. char 'C'2. char 'B'3. int 674. int 66
![Page 16: Clean Integral Codemeetingcpp.com/mcpp/slides/2018/Clean Integral Code.pdf · Clean Code Integers Quiz" You need t o l ear n t he w hol e l anguage. "Kate Gregory @Meeting C++ 2017](https://reader036.fdocuments.us/reader036/viewer/2022063022/5fe6e460600380430316c375/html5/thumbnails/16.jpg)
5. Considering auto a = 'A' + static_cast<bool>(2);
What is the value and type of a?1. char 'C'2. char 'B'3. int 674. int 66
Answer: D, int 66
![Page 17: Clean Integral Codemeetingcpp.com/mcpp/slides/2018/Clean Integral Code.pdf · Clean Code Integers Quiz" You need t o l ear n t he w hol e l anguage. "Kate Gregory @Meeting C++ 2017](https://reader036.fdocuments.us/reader036/viewer/2022063022/5fe6e460600380430316c375/html5/thumbnails/17.jpg)
6. Considering auto a = -10l / 2u;
What is the value of a?1. compile error2. -53. 2'147'483'6444. it depends
![Page 18: Clean Integral Codemeetingcpp.com/mcpp/slides/2018/Clean Integral Code.pdf · Clean Code Integers Quiz" You need t o l ear n t he w hol e l anguage. "Kate Gregory @Meeting C++ 2017](https://reader036.fdocuments.us/reader036/viewer/2022063022/5fe6e460600380430316c375/html5/thumbnails/18.jpg)
6. Considering auto a = -10l / 2u;
What is the value of a?1. compile error2. -53. 2'147'483'6444. it depends
Answer: D. it depends on the sizes
![Page 19: Clean Integral Codemeetingcpp.com/mcpp/slides/2018/Clean Integral Code.pdf · Clean Code Integers Quiz" You need t o l ear n t he w hol e l anguage. "Kate Gregory @Meeting C++ 2017](https://reader036.fdocuments.us/reader036/viewer/2022063022/5fe6e460600380430316c375/html5/thumbnails/19.jpg)
About me
About Optiver
Clean Code
Integers
Quiz
"You need to learn the whole language."
Kate Gregory @Meeting C++ 2017
"And then avoid the obscure parts."
me @Meeting C++ 2018
![Page 20: Clean Integral Codemeetingcpp.com/mcpp/slides/2018/Clean Integral Code.pdf · Clean Code Integers Quiz" You need t o l ear n t he w hol e l anguage. "Kate Gregory @Meeting C++ 2017](https://reader036.fdocuments.us/reader036/viewer/2022063022/5fe6e460600380430316c375/html5/thumbnails/20.jpg)
Clean Code Clear, single purpose
Clear, minimal set of states
Clear, minimal set of operations
Clear means:Raises no questions
![Page 21: Clean Integral Codemeetingcpp.com/mcpp/slides/2018/Clean Integral Code.pdf · Clean Code Integers Quiz" You need t o l ear n t he w hol e l anguage. "Kate Gregory @Meeting C++ 2017](https://reader036.fdocuments.us/reader036/viewer/2022063022/5fe6e460600380430316c375/html5/thumbnails/21.jpg)
Clean Code Clear, single purpose
Clear, minimal set of states
Clear, minimal set of operations
Clear means:Raises no questions
template<typename IntT> void PrintInt(IntT i) { std::cout << i; }
PrintInt<std::int8_t>(65);
![Page 22: Clean Integral Codemeetingcpp.com/mcpp/slides/2018/Clean Integral Code.pdf · Clean Code Integers Quiz" You need t o l ear n t he w hol e l anguage. "Kate Gregory @Meeting C++ 2017](https://reader036.fdocuments.us/reader036/viewer/2022063022/5fe6e460600380430316c375/html5/thumbnails/22.jpg)
Clean Code Clear, single purpose
Clear, minimal set of states
Clear, minimal set of operations
Clear means:Raises no questions
Gives no surprises
![Page 23: Clean Integral Codemeetingcpp.com/mcpp/slides/2018/Clean Integral Code.pdf · Clean Code Integers Quiz" You need t o l ear n t he w hol e l anguage. "Kate Gregory @Meeting C++ 2017](https://reader036.fdocuments.us/reader036/viewer/2022063022/5fe6e460600380430316c375/html5/thumbnails/23.jpg)
class Client { public: Client(); void Configure(const Config&); void Connect(); void Disconnect();
void GetData(std::function<void(Data)>); };
Refactoring Client
void GetDataFromClient(Client& client) { // what is the state of the client? client.GetData([](auto&& data) { ... }); }
![Page 24: Clean Integral Codemeetingcpp.com/mcpp/slides/2018/Clean Integral Code.pdf · Clean Code Integers Quiz" You need t o l ear n t he w hol e l anguage. "Kate Gregory @Meeting C++ 2017](https://reader036.fdocuments.us/reader036/viewer/2022063022/5fe6e460600380430316c375/html5/thumbnails/24.jpg)
class Client { public: Client(); void Configure(const Config&); void Connect(); void Disconnect();
void GetData(std::function<void(Data)>); };
class Client { public: explicit Client(const Config&);
void GetData(std::function<void(Data)>); };
Refactoring Client
void GetDataFromClient(Client& client) { // what is the state of the client? client.GetData([](auto&& data) { ... }); }
![Page 25: Clean Integral Codemeetingcpp.com/mcpp/slides/2018/Clean Integral Code.pdf · Clean Code Integers Quiz" You need t o l ear n t he w hol e l anguage. "Kate Gregory @Meeting C++ 2017](https://reader036.fdocuments.us/reader036/viewer/2022063022/5fe6e460600380430316c375/html5/thumbnails/25.jpg)
Clean Code Rules of clean code:Single purpose
Minimal set of states
Minimal set of operations
No questions
No surprises
![Page 26: Clean Integral Codemeetingcpp.com/mcpp/slides/2018/Clean Integral Code.pdf · Clean Code Integers Quiz" You need t o l ear n t he w hol e l anguage. "Kate Gregory @Meeting C++ 2017](https://reader036.fdocuments.us/reader036/viewer/2022063022/5fe6e460600380430316c375/html5/thumbnails/26.jpg)
Clean Code
Integers- Types
signed unsigned
boolchar signed char unsigned charwchar_t
char16_tchar32_t
short unsigned shortint unsigned (int)long (int) unsigned long (int)long long (int) unsigned long long (int)
![Page 27: Clean Integral Codemeetingcpp.com/mcpp/slides/2018/Clean Integral Code.pdf · Clean Code Integers Quiz" You need t o l ear n t he w hol e l anguage. "Kate Gregory @Meeting C++ 2017](https://reader036.fdocuments.us/reader036/viewer/2022063022/5fe6e460600380430316c375/html5/thumbnails/27.jpg)
Clean Code
Integers- Types
- Aliases
signed unsigned
std::int8_t std::uint8_tstd::int16_t std::uint16_tstd::int32_t std::uint32_tstd::int64_t std::uint64_tstd::int_least8_t std::uint_least8_tstd::int_least16_t std::uint_least16_tstd::int_least32_t std::uint_least32_tstd::int_least64_t std::uint_least64_tstd::int_fast8_t std::uint_fast8_tstd::int_fast16_t std::uint_fast16_tstd::int_fast32_t std::uint_fast32_tstd::int_fast64_t std::uint_fast64_tstd::intmax_t std::uintmax_tstd::intptr_t std::uintptr_tstd::ptrdiff_t
std::size_t
![Page 28: Clean Integral Codemeetingcpp.com/mcpp/slides/2018/Clean Integral Code.pdf · Clean Code Integers Quiz" You need t o l ear n t he w hol e l anguage. "Kate Gregory @Meeting C++ 2017](https://reader036.fdocuments.us/reader036/viewer/2022063022/5fe6e460600380430316c375/html5/thumbnails/28.jpg)
Clean Code
Integers
Use cases
![Page 29: Clean Integral Codemeetingcpp.com/mcpp/slides/2018/Clean Integral Code.pdf · Clean Code Integers Quiz" You need t o l ear n t he w hol e l anguage. "Kate Gregory @Meeting C++ 2017](https://reader036.fdocuments.us/reader036/viewer/2022063022/5fe6e460600380430316c375/html5/thumbnails/29.jpg)
Clean Code
Integers
Use cases- Bit manipulation
Range of values: 0 or 1 (N times)
Best integer type: unsigned integers
Operations: | & ^ ~ << >>
Stronger type: std::bitset
![Page 30: Clean Integral Codemeetingcpp.com/mcpp/slides/2018/Clean Integral Code.pdf · Clean Code Integers Quiz" You need t o l ear n t he w hol e l anguage. "Kate Gregory @Meeting C++ 2017](https://reader036.fdocuments.us/reader036/viewer/2022063022/5fe6e460600380430316c375/html5/thumbnails/30.jpg)
// API namespace GPIO { void SetPin(int pin); void SetPins(std::uint8_t pins); }
// user code { auto pins = 7; GPIO::SetPin(pins); }
Refactoring bits
![Page 31: Clean Integral Codemeetingcpp.com/mcpp/slides/2018/Clean Integral Code.pdf · Clean Code Integers Quiz" You need t o l ear n t he w hol e l anguage. "Kate Gregory @Meeting C++ 2017](https://reader036.fdocuments.us/reader036/viewer/2022063022/5fe6e460600380430316c375/html5/thumbnails/31.jpg)
// API namespace GPIO { void SetPin(int pin); void SetPins(std::uint8_t pins); }
// user code { auto pins = 7; GPIO::SetPin(pins); }
// API namespace GPIO { void SetPin(int); void SetPins(std::bitset<8>); }
// user code { std::bitset<8> pins{7}; GPIO::SetPin(pins); }
Refactoring bits
![Page 32: Clean Integral Codemeetingcpp.com/mcpp/slides/2018/Clean Integral Code.pdf · Clean Code Integers Quiz" You need t o l ear n t he w hol e l anguage. "Kate Gregory @Meeting C++ 2017](https://reader036.fdocuments.us/reader036/viewer/2022063022/5fe6e460600380430316c375/html5/thumbnails/32.jpg)
// API namespace GPIO { void SetPin(int pin); void SetPins(std::uint8_t pins); }
// user code { auto pins = 7; GPIO::SetPin(pins); }
// API namespace GPIO { void SetPin(int); void SetPins(std::bitset<8>); }
// user code { std::bitset<8> pins{7}; GPIO::SetPin(pins); }
namespace GPIO { void SetPins(std::uint24_t); }
namespace GPIO { void SetPins(std::bitset<24>); }
Refactoring bits
![Page 33: Clean Integral Codemeetingcpp.com/mcpp/slides/2018/Clean Integral Code.pdf · Clean Code Integers Quiz" You need t o l ear n t he w hol e l anguage. "Kate Gregory @Meeting C++ 2017](https://reader036.fdocuments.us/reader036/viewer/2022063022/5fe6e460600380430316c375/html5/thumbnails/33.jpg)
Clean Code
Integers
Use cases- Bit manipulation
Range of values: 0 or 1 (N times)
Best integer type: unsigned integers
Operations: | & ^ << >>
Stronger type: std::bitset
Conclusion: Don't use integers but use std::bitset if you can
![Page 34: Clean Integral Codemeetingcpp.com/mcpp/slides/2018/Clean Integral Code.pdf · Clean Code Integers Quiz" You need t o l ear n t he w hol e l anguage. "Kate Gregory @Meeting C++ 2017](https://reader036.fdocuments.us/reader036/viewer/2022063022/5fe6e460600380430316c375/html5/thumbnails/34.jpg)
Clean Code
Integers
Use cases- Bit manipulation
- Truth values
Range of values: false or true
Best integer type: bool
Operations: || && !
![Page 35: Clean Integral Codemeetingcpp.com/mcpp/slides/2018/Clean Integral Code.pdf · Clean Code Integers Quiz" You need t o l ear n t he w hol e l anguage. "Kate Gregory @Meeting C++ 2017](https://reader036.fdocuments.us/reader036/viewer/2022063022/5fe6e460600380430316c375/html5/thumbnails/35.jpg)
Clean Code
Integers
Use cases- Bit manipulation
- Truth values
Range of values: false or true
Best integer type: bool
Operations: || && !
if (container.count())
if (container.count() != 0) // or if (!container.empty())
void conditional_increment(int& count, bool increment) { count += increment; // or count += increment ? 1 : 0; }
![Page 36: Clean Integral Codemeetingcpp.com/mcpp/slides/2018/Clean Integral Code.pdf · Clean Code Integers Quiz" You need t o l ear n t he w hol e l anguage. "Kate Gregory @Meeting C++ 2017](https://reader036.fdocuments.us/reader036/viewer/2022063022/5fe6e460600380430316c375/html5/thumbnails/36.jpg)
class Socket {public: Socket(); void SetNonBlocking(bool); void EnableNagle(); void SetDestination(std::string, int); void Connect(); ...};
Socket mySocket;mySocket.SetNonBlocking(true);mySocket.EnableNagle();mySocket.SetDestination("localhost", 8080);mySocket.Connect();
Refactoring with booleans
![Page 37: Clean Integral Codemeetingcpp.com/mcpp/slides/2018/Clean Integral Code.pdf · Clean Code Integers Quiz" You need t o l ear n t he w hol e l anguage. "Kate Gregory @Meeting C++ 2017](https://reader036.fdocuments.us/reader036/viewer/2022063022/5fe6e460600380430316c375/html5/thumbnails/37.jpg)
class Socket {public: Socket(string, int, bool blocking, bool nagle); ...};
Socket mySocket("localhost", 8080, true, false);
Refactoring with booleans
![Page 38: Clean Integral Codemeetingcpp.com/mcpp/slides/2018/Clean Integral Code.pdf · Clean Code Integers Quiz" You need t o l ear n t he w hol e l anguage. "Kate Gregory @Meeting C++ 2017](https://reader036.fdocuments.us/reader036/viewer/2022063022/5fe6e460600380430316c375/html5/thumbnails/38.jpg)
class Socket {public: Socket(string, int, bool blocking, bool nagle); ...};
class Socket {public: Socket(string, bool blocking, int, bool nagle); ...};
Socket mySocket("localhost", 8080, true, false);
Refactoring with booleans
![Page 39: Clean Integral Codemeetingcpp.com/mcpp/slides/2018/Clean Integral Code.pdf · Clean Code Integers Quiz" You need t o l ear n t he w hol e l anguage. "Kate Gregory @Meeting C++ 2017](https://reader036.fdocuments.us/reader036/viewer/2022063022/5fe6e460600380430316c375/html5/thumbnails/39.jpg)
struct SocketConfig { std::string host; int port = 0; bool blocking = true; bool nagle = false;};
class Socket {public: explicit Socket(SocketConfig); ...};
Refactoring with booleans
![Page 40: Clean Integral Codemeetingcpp.com/mcpp/slides/2018/Clean Integral Code.pdf · Clean Code Integers Quiz" You need t o l ear n t he w hol e l anguage. "Kate Gregory @Meeting C++ 2017](https://reader036.fdocuments.us/reader036/viewer/2022063022/5fe6e460600380430316c375/html5/thumbnails/40.jpg)
struct SocketConfig { std::string host; int port = 0; bool blocking = true; bool nagle = false;};
class Socket {public: explicit Socket(SocketConfig); ...};
Socket mySocket( SocketConfig{ "localhost", 8080, true, false});
Refactoring with booleans
![Page 41: Clean Integral Codemeetingcpp.com/mcpp/slides/2018/Clean Integral Code.pdf · Clean Code Integers Quiz" You need t o l ear n t he w hol e l anguage. "Kate Gregory @Meeting C++ 2017](https://reader036.fdocuments.us/reader036/viewer/2022063022/5fe6e460600380430316c375/html5/thumbnails/41.jpg)
enum class Mode { Blocking, NonBlocking };enum class Nagle { Enabled, Disabled };
class Socket {public: Socket(std::string, int, Mode, Nagle); ...};
Socket mySocket( "localhost", 8080, Mode::NonBlocking, Nagle::Disabled);
Refactoring with booleans
![Page 42: Clean Integral Codemeetingcpp.com/mcpp/slides/2018/Clean Integral Code.pdf · Clean Code Integers Quiz" You need t o l ear n t he w hol e l anguage. "Kate Gregory @Meeting C++ 2017](https://reader036.fdocuments.us/reader036/viewer/2022063022/5fe6e460600380430316c375/html5/thumbnails/42.jpg)
class Socket {public: Socket( std::string, int, Bool<Blocking>, Bool<struct Nagle>);
Socket mySocket( "localhost", 8080, True<Blocking>, False<Nagle>);
Refactoring with booleans
![Page 43: Clean Integral Codemeetingcpp.com/mcpp/slides/2018/Clean Integral Code.pdf · Clean Code Integers Quiz" You need t o l ear n t he w hol e l anguage. "Kate Gregory @Meeting C++ 2017](https://reader036.fdocuments.us/reader036/viewer/2022063022/5fe6e460600380430316c375/html5/thumbnails/43.jpg)
class Socket {public: Socket( std::string, int, Bool<Blocking>, Bool<struct Nagle>);
Socket mySocket( "localhost", 8080, True<Blocking>, False<Nagle>);
Refactoring with booleans
template<typename tag>class Bool{public: constexpr explicit Bool(bool value): value(value) {} constexpr Bool(const Bool<tag>&) = default;
constexpr explicit operator bool() const { return value; }
private: bool value;};
template<typename tag> constexpr Bool<tag> True{true};template<typename tag> constexpr Bool<tag> False{false};
![Page 44: Clean Integral Codemeetingcpp.com/mcpp/slides/2018/Clean Integral Code.pdf · Clean Code Integers Quiz" You need t o l ear n t he w hol e l anguage. "Kate Gregory @Meeting C++ 2017](https://reader036.fdocuments.us/reader036/viewer/2022063022/5fe6e460600380430316c375/html5/thumbnails/44.jpg)
Clean Code
Integers
Use cases- Bit manipulation
- Truth values
Range of values: false or true
Best integer type: bool
Operations: || && !
Stronger type: enum class, or strong bool
Conclusion: Don't use booleans for function arguments unless they are thesole argument.
![Page 45: Clean Integral Codemeetingcpp.com/mcpp/slides/2018/Clean Integral Code.pdf · Clean Code Integers Quiz" You need t o l ear n t he w hol e l anguage. "Kate Gregory @Meeting C++ 2017](https://reader036.fdocuments.us/reader036/viewer/2022063022/5fe6e460600380430316c375/html5/thumbnails/45.jpg)
Clean Code
Integers
Use cases- Bit manipulation
- Truth values
- Text
Range of values (for chars): [0, 255] or [-128, 127]
Best integer type: char
Operations:
![Page 46: Clean Integral Codemeetingcpp.com/mcpp/slides/2018/Clean Integral Code.pdf · Clean Code Integers Quiz" You need t o l ear n t he w hol e l anguage. "Kate Gregory @Meeting C++ 2017](https://reader036.fdocuments.us/reader036/viewer/2022063022/5fe6e460600380430316c375/html5/thumbnails/46.jpg)
Clean Code
Integers
Use cases- Bit manipulation
- Truth values
- Text
Range of values (for chars): [0, 255] or [-128, 127]
Best integer type: char
Operations:
char a = '}' - 5;
char b = 'a' * 2;
char c = '0' + digit;
![Page 47: Clean Integral Codemeetingcpp.com/mcpp/slides/2018/Clean Integral Code.pdf · Clean Code Integers Quiz" You need t o l ear n t he w hol e l anguage. "Kate Gregory @Meeting C++ 2017](https://reader036.fdocuments.us/reader036/viewer/2022063022/5fe6e460600380430316c375/html5/thumbnails/47.jpg)
Clean Code
Integers
Use cases- Bit manipulation
- Truth values
- Text
Range of values (for chars): [0, 255] or [-128, 127]
Best integer type: char
Operations: == !=
Stronger type: std::string
![Page 48: Clean Integral Codemeetingcpp.com/mcpp/slides/2018/Clean Integral Code.pdf · Clean Code Integers Quiz" You need t o l ear n t he w hol e l anguage. "Kate Gregory @Meeting C++ 2017](https://reader036.fdocuments.us/reader036/viewer/2022063022/5fe6e460600380430316c375/html5/thumbnails/48.jpg)
Clean Code
Integers
Use cases- Bit manipulation
- Truth values
- Text
- Numeric Identi�ers
Range of values: depends
Best integer type: anything big enough
Operations: == < ++
Stronger type:
![Page 49: Clean Integral Codemeetingcpp.com/mcpp/slides/2018/Clean Integral Code.pdf · Clean Code Integers Quiz" You need t o l ear n t he w hol e l anguage. "Kate Gregory @Meeting C++ 2017](https://reader036.fdocuments.us/reader036/viewer/2022063022/5fe6e460600380430316c375/html5/thumbnails/49.jpg)
Clean Code
Integers
Use cases- Bit manipulation
- Truth values
- Text
- Numeric Identi�ers
Range of values: depends
Best integer type: anything big enough
Operations: == < ++
Stronger type:
// API void Hire(std::uint64_t company_id, std::uint64_t employee_id);
// user code Hire(employee.id, company.id);
// API void Hire(ID<Company>, ID<Employee>);
// user code Hire(employee.id, company.id);
![Page 50: Clean Integral Codemeetingcpp.com/mcpp/slides/2018/Clean Integral Code.pdf · Clean Code Integers Quiz" You need t o l ear n t he w hol e l anguage. "Kate Gregory @Meeting C++ 2017](https://reader036.fdocuments.us/reader036/viewer/2022063022/5fe6e460600380430316c375/html5/thumbnails/50.jpg)
Clean Code
Integers
Use cases- Bit manipulation
- Truth values
- Text
- Numeric Identi�ers
Range of values: depends
Best integer type: anything big enough
Operations: == < ++
Conclusion: use a strongly typed ID class
![Page 51: Clean Integral Codemeetingcpp.com/mcpp/slides/2018/Clean Integral Code.pdf · Clean Code Integers Quiz" You need t o l ear n t he w hol e l anguage. "Kate Gregory @Meeting C++ 2017](https://reader036.fdocuments.us/reader036/viewer/2022063022/5fe6e460600380430316c375/html5/thumbnails/51.jpg)
Clean Code
Integers
Use cases- Bit manipulation
- Truth values
- Text
- Numeric Identi�ers
- Amounts, indices
Natural range of values: [0, +inf]
Natural integer type: unsigned
Operations: mathemetical operations (no boolean, no bit manipulation)
![Page 52: Clean Integral Codemeetingcpp.com/mcpp/slides/2018/Clean Integral Code.pdf · Clean Code Integers Quiz" You need t o l ear n t he w hol e l anguage. "Kate Gregory @Meeting C++ 2017](https://reader036.fdocuments.us/reader036/viewer/2022063022/5fe6e460600380430316c375/html5/thumbnails/52.jpg)
auto subtract(const Date&, const Date&); auto subtract(time_point, time_point); auto subtract(void*, void*);
auto subtract(unsigned a, unsigned b) { return a - b; }
-> int; -> duration; -> std::ptrdiff_t;
-> unsigned
Di�erence types
![Page 53: Clean Integral Codemeetingcpp.com/mcpp/slides/2018/Clean Integral Code.pdf · Clean Code Integers Quiz" You need t o l ear n t he w hol e l anguage. "Kate Gregory @Meeting C++ 2017](https://reader036.fdocuments.us/reader036/viewer/2022063022/5fe6e460600380430316c375/html5/thumbnails/53.jpg)
Clean Code
Integers
Use cases- Bit manipulation
- Truth values
- Text
- Numeric Identi�ers
- Amounts, indices
Range of values: [-inf, +inf]
Natural integer type: int, std::int64_t
Operations: mathematical operations (no boolean, no bit manipulation)
![Page 54: Clean Integral Codemeetingcpp.com/mcpp/slides/2018/Clean Integral Code.pdf · Clean Code Integers Quiz" You need t o l ear n t he w hol e l anguage. "Kate Gregory @Meeting C++ 2017](https://reader036.fdocuments.us/reader036/viewer/2022063022/5fe6e460600380430316c375/html5/thumbnails/54.jpg)
Common arguments for using unsigned:I need the positive range.
Zero as the lowest possible value expresses the real range better.
Defined behaviour is good.
for (std::size_t i = 0; i < container.size()-1; ++i) std::cout << i << ": " << container[i] << '\n';
But the containers in the STL use std::size_t!
![Page 55: Clean Integral Codemeetingcpp.com/mcpp/slides/2018/Clean Integral Code.pdf · Clean Code Integers Quiz" You need t o l ear n t he w hol e l anguage. "Kate Gregory @Meeting C++ 2017](https://reader036.fdocuments.us/reader036/viewer/2022063022/5fe6e460600380430316c375/html5/thumbnails/55.jpg)
Signed vs unsigned
They are wrong. And we're sorry.
Herb Sutter & Chandler Carruth @ CPPCon
![Page 56: Clean Integral Codemeetingcpp.com/mcpp/slides/2018/Clean Integral Code.pdf · Clean Code Integers Quiz" You need t o l ear n t he w hol e l anguage. "Kate Gregory @Meeting C++ 2017](https://reader036.fdocuments.us/reader036/viewer/2022063022/5fe6e460600380430316c375/html5/thumbnails/56.jpg)
Clean Code
Integers
Use cases- Bit manipulation
- Truth values
- Text
- Numeric Identi�ers
- Amounts, indices
Range of values: [-inf, +inf]
Natural integer type: int, std::int64_t
Operations: mathematical operations (no boolean, no bit manipulation)
How to deal with this buggy STL?
![Page 57: Clean Integral Codemeetingcpp.com/mcpp/slides/2018/Clean Integral Code.pdf · Clean Code Integers Quiz" You need t o l ear n t he w hol e l anguage. "Kate Gregory @Meeting C++ 2017](https://reader036.fdocuments.us/reader036/viewer/2022063022/5fe6e460600380430316c375/html5/thumbnails/57.jpg)
Clean Code
Integers
Use cases- Bit manipulation
- Truth values
- Text
- Numeric Identi�ers
- Amounts, indices
Range of values: [-inf, +inf]
Natural integer type: int, std::int64_t
Operations: mathematical operations (no boolean, no bit manipulation)
How to deal with this buggy STL?Use iterators if you can
Convert to signed quickly (don't mix signed and unsigned)
![Page 58: Clean Integral Codemeetingcpp.com/mcpp/slides/2018/Clean Integral Code.pdf · Clean Code Integers Quiz" You need t o l ear n t he w hol e l anguage. "Kate Gregory @Meeting C++ 2017](https://reader036.fdocuments.us/reader036/viewer/2022063022/5fe6e460600380430316c375/html5/thumbnails/58.jpg)
Clean Code
Integers
Use cases- Bit manipulation
- Truth values
- Text
- Numeric Identi�ers
- Amounts, indices
Range of values: [-inf, +inf]
Natural integer type: int, std::int64_t
Operations: mathematical operations (no boolean, no bit manipulation)
How to deal with this buggy STL?Use iterators if you can
Convert to signed quickly (don't mix signed and unsigned)
How to prevent unexpected behaviour?
![Page 59: Clean Integral Codemeetingcpp.com/mcpp/slides/2018/Clean Integral Code.pdf · Clean Code Integers Quiz" You need t o l ear n t he w hol e l anguage. "Kate Gregory @Meeting C++ 2017](https://reader036.fdocuments.us/reader036/viewer/2022063022/5fe6e460600380430316c375/html5/thumbnails/59.jpg)
How to prevent unexpected behaviour?auto CalculateMean(const std::vector<std::int32_t>& values) { std::int32_t total = 0; for (auto v: values) { total += v; } return total / values.size();}
![Page 60: Clean Integral Codemeetingcpp.com/mcpp/slides/2018/Clean Integral Code.pdf · Clean Code Integers Quiz" You need t o l ear n t he w hol e l anguage. "Kate Gregory @Meeting C++ 2017](https://reader036.fdocuments.us/reader036/viewer/2022063022/5fe6e460600380430316c375/html5/thumbnails/60.jpg)
How to prevent unexpected behaviour?std::int32_t CalculateMean(const std::vector<std::int32_t>& values) { if (values.empty()) throw std::invalid_argument("CalculateMean received empty vector");
std::int64_t total = 0; for (auto v: values) { total += v; } // no warnings with -Wall, -Wpedantic, -Wextra or -Wconversion // only with -Wsign-conversion return total / values.size();}
![Page 61: Clean Integral Codemeetingcpp.com/mcpp/slides/2018/Clean Integral Code.pdf · Clean Code Integers Quiz" You need t o l ear n t he w hol e l anguage. "Kate Gregory @Meeting C++ 2017](https://reader036.fdocuments.us/reader036/viewer/2022063022/5fe6e460600380430316c375/html5/thumbnails/61.jpg)
How to prevent unexpected behaviour?std::int32_t CalculateMean(const std::vector<std::int32_t>& values) { if (values.empty()) throw std::invalid_argument("CalculateMean received empty vector");
std::int64_t total = 0; for (auto v: values) { total += v; } return total / static_cast<std::int64_t>(values.size());}
![Page 62: Clean Integral Codemeetingcpp.com/mcpp/slides/2018/Clean Integral Code.pdf · Clean Code Integers Quiz" You need t o l ear n t he w hol e l anguage. "Kate Gregory @Meeting C++ 2017](https://reader036.fdocuments.us/reader036/viewer/2022063022/5fe6e460600380430316c375/html5/thumbnails/62.jpg)
How to prevent unexpected behaviour?std::int32_t CalculateMean(const std::vector<std::int32_t>& values) { if (values.empty()) throw std::invalid_argument("CalculateMean received empty vector");
std::int64_t total = 0; for (auto v: values) { total += v; }
if (values.size() > std::numeric_limits<std::int64_t>::max()) throw std::runtime_error("CalculateMean received too many values"); return total / static_cast<std::int64_t>(values.size());}
![Page 63: Clean Integral Codemeetingcpp.com/mcpp/slides/2018/Clean Integral Code.pdf · Clean Code Integers Quiz" You need t o l ear n t he w hol e l anguage. "Kate Gregory @Meeting C++ 2017](https://reader036.fdocuments.us/reader036/viewer/2022063022/5fe6e460600380430316c375/html5/thumbnails/63.jpg)
How to prevent unexpected behaviour?std::int32_t CalculateMean(const std::vector<std::int32_t>& values) { if (values.empty()) throw std::invalid_argument("CalculateMean received empty vector");
std::int64_t total = 0; for (auto v: values) { constexpr auto max = std::numeric_limits<std::int64_t>::max(); if (total + v > max) throw std::runtime_error("CalculateMean overflowed"); total += v; } return total / static_cast<std::int64_t>(values.size());}
![Page 64: Clean Integral Codemeetingcpp.com/mcpp/slides/2018/Clean Integral Code.pdf · Clean Code Integers Quiz" You need t o l ear n t he w hol e l anguage. "Kate Gregory @Meeting C++ 2017](https://reader036.fdocuments.us/reader036/viewer/2022063022/5fe6e460600380430316c375/html5/thumbnails/64.jpg)
How to prevent unexpected behaviour?std::int32_t CalculateMean(const std::vector<std::int32_t>& values) { if (values.empty()) throw std::invalid_argument("CalculateMean received empty vector");
std::int64_t total = 0; for (auto v: values) { constexpr auto max = std::numeric_limits<std::int64_t>::max(); constexpr auto min = std::numeric_limits<std::int64_t>::min(); if (v > 0 && total > max - v) throw std::runtime_error("CalculateMean overflowed"); if (v < 0 && total < min - v) throw std::runtime_error("CalculateMean underflowed"); total += v; } return total / static_cast<std::int64_t>(values.size());}
![Page 65: Clean Integral Codemeetingcpp.com/mcpp/slides/2018/Clean Integral Code.pdf · Clean Code Integers Quiz" You need t o l ear n t he w hol e l anguage. "Kate Gregory @Meeting C++ 2017](https://reader036.fdocuments.us/reader036/viewer/2022063022/5fe6e460600380430316c375/html5/thumbnails/65.jpg)
Clean Code
Integers
Use cases- Bit manipulation
- Truth values
- Text
- Numeric Identi�ers
- Amounts, indices
Range of values: [-inf, +inf]
Natural integer type: int, std::int64_t
Operations: mathematical operations (no boolean, no bit manipulation)
How to deal with this buggy STL?Use iterators if you can
Convert to signed quickly (don't mix signed and unsigned)
How to prevent unexpected behaviour?Manual checking is hard
Use compiler warnings and static analyzers
Use a library solution
boost multiprecisionboost numeric conversionboost safe numerics
![Page 66: Clean Integral Codemeetingcpp.com/mcpp/slides/2018/Clean Integral Code.pdf · Clean Code Integers Quiz" You need t o l ear n t he w hol e l anguage. "Kate Gregory @Meeting C++ 2017](https://reader036.fdocuments.us/reader036/viewer/2022063022/5fe6e460600380430316c375/html5/thumbnails/66.jpg)
The last slideRaw integers do not limit states and operations e�ectively
Use the strongest type available
Strive for no questions, no surprises
Questions?
![Page 67: Clean Integral Codemeetingcpp.com/mcpp/slides/2018/Clean Integral Code.pdf · Clean Code Integers Quiz" You need t o l ear n t he w hol e l anguage. "Kate Gregory @Meeting C++ 2017](https://reader036.fdocuments.us/reader036/viewer/2022063022/5fe6e460600380430316c375/html5/thumbnails/67.jpg)