Skip to content

Commit

Permalink
Update README.md
Browse files Browse the repository at this point in the history
  • Loading branch information
Alkenso authored Jul 22, 2019
1 parent 34e5c31 commit 574a2d2
Showing 1 changed file with 62 additions and 1 deletion.
63 changes: 62 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,2 +1,63 @@
# assenum
# asenum
AssociatedEnum: header-only library for C++ for enumerations with associated values

asenum is C++ implementation of very neat enums from Swift language (https://docs.swift.org/swift-book/LanguageGuide/Enumerations.html, chapter 'Associated Values').

asenum combines Enum and Variant: it allows to create lighweight wrapper around plain C++ enum and add ability to assign different value types to different cases.

Features:
- each enum case can be associated with different type
- values are immutable: totally thread-safe
- simple and powerful interface
- lightweight header-only single file library
- requires only C++11

Example:
```
#include <string>
#include <chrono>
enum class Setting
{
Host,
Port,
Timeout
};
// Declare associated enum 'AnySetting' with style of CamelCase without 'get' word in getters.
ASENUM_DECLARE(AnySetting, Setting)
{
ASENUM_DEFINE_STRUCTORS();
ASENUM_CASE_CC(Host, std::string);
ASENUM_CASE_CC(Port, uint16_t);
ASENUM_CASE_CC(Timeout, std::chrono::seconds);
};
//===== USAGE =====
void LogSetting(const AnySetting& setting)
{
switch (setting.type())
{
case Setting::Host:
std::cout << "Host: " << setting.Host() << "\n";
break;
case Setting::Port:
std::cout << "Port: " << setting.Port()<< "\n";
break;
case Setting::Timeout:
std::cout << "Timeout: " << setting.Timeout().count() << "\n";
break;
default:
break;
}
}
// ===== CREATION =====
LogSetting(AnySetting::CreateHost("test.api.com"));
LogSetting(AnySetting::CreatePort(65535));
LogSetting(AnySetting::CreateTimeout(std::chrono::seconds(1));
```

0 comments on commit 574a2d2

Please sign in to comment.