mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Documentation and Changelog
This commit is contained in:
parent
d67391531e
commit
fbb1b884b2
@ -3,6 +3,7 @@
|
||||
Language Features:
|
||||
* Inheritance: A function that overrides only a single interface function does not require the ``override`` specifier.
|
||||
* Type System: Support ``type().min`` and ``type().max`` for enums.
|
||||
* User Defined Value Type: allows creating a zero cost abstraction over a value type with stricter type requirements.
|
||||
|
||||
|
||||
Compiler Features:
|
||||
|
@ -113,6 +113,9 @@ them.
|
||||
+-------------------------------+-----------------------------------------------------------------------------+
|
||||
|:ref:`enum<enums>` |``uint8`` |
|
||||
+-------------------------------+-----------------------------------------------------------------------------+
|
||||
|:ref:`user defined value types |its underlying value type |
|
||||
|<user-defined-value-types>` | |
|
||||
+-------------------------------+-----------------------------------------------------------------------------+
|
||||
|:ref:`struct<structs>` |``tuple`` |
|
||||
+-------------------------------+-----------------------------------------------------------------------------+
|
||||
|
||||
|
@ -628,6 +628,69 @@ smallest and respectively largest value of the given enum.
|
||||
.. note::
|
||||
Enums can also be declared on the file level, outside of contract or library definitions.
|
||||
|
||||
.. index:: ! user defined value type, custom type
|
||||
|
||||
.. _user-defined-value-types:
|
||||
|
||||
User Defined Value Types
|
||||
------------------------
|
||||
|
||||
A user defined value type allows creating a zero cost abstraction over an elementary value type.
|
||||
This is similar to an alias, but with stricter type requirements.
|
||||
|
||||
A user defined value type is defined using ``type C is V``, where ``C`` is the name of the newly
|
||||
introduced type and ``V`` has to be a built-in value type (the "underlying type"). The function
|
||||
``C.wrap`` is used to convert from the underlying type to the custom type. Similarly, the
|
||||
function ``C.unwrap`` is used to convert from the custom type to the underlying type.
|
||||
|
||||
The type ``C`` does not have any operators or bound member functions. In particular, even the
|
||||
operator ``==`` is not defined. Explicit and implicit conversions to and from other types are
|
||||
disallowed.
|
||||
|
||||
The data-representation of values of such types are inherited from the underlying type
|
||||
and the underlying type is also used in the ABI.
|
||||
|
||||
The following example illustrates a custom type ``UFixed256x18`` representing a decimal fixed point
|
||||
type with 18 decimals and a minimal library to do arithmetic operations on the type.
|
||||
|
||||
|
||||
.. code-block:: solidity
|
||||
|
||||
// SPDX-License-Identifier: GPL-3.0
|
||||
pragma solidity ^0.8.8;
|
||||
|
||||
// Represent a 18 decimal, 256 bit wide fixed point type using a user defined value type.
|
||||
type UFixed256x18 is uint256;
|
||||
|
||||
/// A minimal library to do fixed point operations on UFixed256x18.
|
||||
library FixedMath {
|
||||
uint constant multiplier = 10**18;
|
||||
|
||||
/// Adds two UFixed256x18 numbers. Reverts on overflow, relying on checked
|
||||
/// arithmetic on uint256.
|
||||
function add(UFixed256x18 a, UFixed256x18 b) internal pure returns (UFixed256x18) {
|
||||
return UFixed256x18.wrap(UFixed256x18.unwrap(a) + UFixed256x18.unwrap(b));
|
||||
}
|
||||
/// Multiplies UFixed256x18 and uint256. Reverts on overflow, relying on checked
|
||||
/// arithmetic on uint256.
|
||||
function mul(UFixed256x18 a, uint256 b) internal pure returns (UFixed256x18) {
|
||||
return UFixed256x18.wrap(UFixed256x18.unwrap(a) * b);
|
||||
}
|
||||
/// Truncates UFixed256x18 to the nearest uint256 number.
|
||||
function truncate(UFixed256x18 a) internal pure returns (uint256) {
|
||||
return UFixed256x18.unwrap(a) / multiplier;
|
||||
}
|
||||
/// Turns a uint256 into a UFixed256x18 of the same value.
|
||||
/// Reverts if the integer is too large.
|
||||
function toUFixed256x18(uint256 a) internal pure returns (UFixed256x18) {
|
||||
return UFixed256x18.wrap(a * multiplier);
|
||||
}
|
||||
}
|
||||
|
||||
Notice how ``UFixed256x18.wrap`` and ``FixedMath.toUFixed256x18`` have the same signature but
|
||||
perform two very different operations: The ``UFixed256x18.wrap`` function returns a ``UFixed256x18``
|
||||
that has the same data representation as the input, whereas ``toUFixed256x18`` returns a
|
||||
``UFixed256x18`` that has the same numerical value.
|
||||
|
||||
.. index:: ! function type, ! type; function
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user