CDT  v4.2.0
инструменты разработчика
singleton.hpp
См. документацию.
1#pragma once
2#include "multi_index.hpp"
3#include "system.hpp"
4
5namespace eosio {
6
20 template<name::raw SingletonName, typename T>
22 {
26 constexpr static uint64_t pk_value = static_cast<uint64_t>(SingletonName);
27
31 struct row {
35 T value;
36
42 uint64_t primary_key() const { return pk_value; }
43
44 EOSLIB_SERIALIZE( row, (value) )
45 };
46
48
49 public:
50
57 singleton( name code, uint64_t scope ) : _t( code, scope ) {}
58
65 bool exists() {
66 return _t.find( pk_value ) != _t.end();
67 }
68
75 T get() {
76 auto itr = _t.find( pk_value );
77 eosio::check( itr != _t.end(), "singleton does not exist" );
78 return itr->value;
79 }
80
87 T get_or_default( const T& def = T() ) {
88 auto itr = _t.find( pk_value );
89 return itr != _t.end() ? itr->value : def;
90 }
91
99 T get_or_create( name bill_to_account, const T& def = T() ) {
100 auto itr = _t.find( pk_value );
101 return itr != _t.end() ? itr->value
102 : _t.emplace(bill_to_account, [&](row& r) { r.value = def; })->value;
103 }
104
111 void set( const T& value, name bill_to_account ) {
112 auto itr = _t.find( pk_value );
113 if( itr != _t.end() ) {
114 _t.modify(itr, bill_to_account, [&](row& r) { r.value = value; });
115 } else {
116 _t.emplace(bill_to_account, [&](row& r) { r.value = value; });
117 }
118 }
119
123 void remove( ) {
124 auto itr = _t.find( pk_value );
125 if( itr != _t.end() ) {
126 _t.erase(itr);
127 }
128 }
129
130 private:
131 table _t;
132 };
133}