Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat!: add number concepts #492

Draft
wants to merge 16 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .cmake-format.yaml
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
include: ["cmake/.cmake-format-additional_commands-jegp.cmake_modules.yaml"]
parse:
additional_commands:
add_documentation:
Expand Down
61 changes: 61 additions & 0 deletions cmake/.cmake-format-additional_commands-jegp.cmake_modules.yaml
mpusz marked this conversation as resolved.
Show resolved Hide resolved
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
parse:
additional_commands:
_jegp_common_yaml_anchors:
kwargs:
PUBLIC_INTERFACE_PRIVATE: &public_interface_private
kwargs:
PUBLIC: +
INTERFACE: +
PRIVATE: +
jegp_add_standardese_sources:
pargs:
nargs: 1
flags:
- EXCLUDE_PDF_FROM_MAIN
- EXCLUDE_HTML_FROM_MAIN
- EXCLUDE_FROM_ALL
kwargs:
LIBRARIES: +
APPENDICES: +
EXTENSIONS: +
CHECKED: 1
PDF_PATH: 1
HTML_PATH: 1
jegp_add_module:
pargs: &jegp_add_module_pargs
nargs: 1
flags:
- IMPORTABLE_HEADER
kwargs:
SOURCES: +
COMPILE_OPTIONS: *public_interface_private
LINK_LIBRARIES: *public_interface_private
jegp_cpp_module:
pargs: *jegp_add_module_pargs
jegp_target_link_header_units:
pargs:
nargs: 1+
jegp_add_headers_test:
pargs:
nargs: 1+
kwargs:
PRIVATE_REGEXES: +
jegp_add_test:
pargs:
nargs: 1+
flags:
- COMPILE_ONLY
kwargs:
TYPE: 1
SOURCES: +
COMPILE_OPTIONS: +
LINK_LIBRARIES: +
jegp_add_build_error:
pargs:
nargs: 1+
kwargs:
AS: 1
TYPE: 1
SOURCE: 1
COMPILE_OPTIONS: +
LINK_LIBRARIES: +
21 changes: 21 additions & 0 deletions docs/reference/CMakeLists.txt
JohelEGP marked this conversation as resolved.
Show resolved Hide resolved
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
cmake_minimum_required(VERSION 3.25.0)
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this version the minimum one required to make it work?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No, but I'm not sure about the dependency itself.

Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If possible, I would like to keep the required version as low as possible to not force the users to install the latest CMake with no good reason.

Alternatively, we can install the required version of CMake with Conan but I would prefer to save it as a last resort option (i.e. to support C++ modules).

project(mp_units_reference_documentations LANGUAGES NONE)
JohelEGP marked this conversation as resolved.
Show resolved Hide resolved

include(JEGPAddStandardeseSources)

set(pdf_title "Mp-units Library")
JohelEGP marked this conversation as resolved.
Show resolved Hide resolved
set(page_license "MIT License")
set(first_library_chapter "nums")
set(last_library_chapter "qties")
# set(pdf_creator "Johel Ernesto Guerrero Pe\\~{n}a")
# set(document_number [[\unspec]])
# set(previous_document_number [[\unspec]])
set(cover_title "Mp-units Library Reference Documentations")
JohelEGP marked this conversation as resolved.
Show resolved Hide resolved
set(reply_to "\\href{${PROJECT_HOMEPAGE_URL}/discussions}{Discussions}, \\href{${PROJECT_HOMEPAGE_URL}/issues}{issues}")
jegp_add_standardese_sources(
mp_units_reference_documentations
LIBRARIES intro numbers;quantities
EXTENSIONS macros_extensions
# CHECKED TRUE
PDF_PATH "mp_units.pdf"
)
2 changes: 2 additions & 0 deletions docs/reference/codeblock/.clang-format
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
BasedOnStyle: InheritParentConfig
ColumnLimit: 97
160 changes: 160 additions & 0 deletions docs/reference/intro.tex
Original file line number Diff line number Diff line change
@@ -0,0 +1,160 @@
%!TEX root = std.tex


\rSec0[scope]{Scope}

\pnum
\indextext{scope|(}%
This document describes the contents of the \defn{mp-units library}.
\indextext{scope|)}


\rSec0[refs]{References}

\pnum
\indextext{references|(}%
The following documents are referred to in the text
in such a way that some or all of their content
constitutes requirements of this document.
For dated references, only the edition cited applies.
For undated references,
the latest edition of the referenced document
(including any amendments) applies.
\begin{itemize}
\item
The \Cpp{} Standards Committee.
N4892: \doccite{Working Draft, Standard for Programming Language \Cpp{}}.
Edited by Thomas K\"{o}ppe.
Available from: \url{https://wg21.link/N4892}
\item
The \Cpp{} Standards Committee.
P1841R1: \doccite{Wording for Individually Specializable Numeric Traits}.
Edited by Walter E. Brown.
Available from: \url{https://wg21.link/P1841R1}
\item
The \Cpp{} Standards Committee.
SD-8: \doccite{Standard Library Compatibility}.
Edited by Bryce Lelbach.
Available from: \url{https://wg21.link/SD8}
\item
ISO 80000-2:2019, \doccite{Quantities and units --- Part 2: Mathematics}
\item
IEC 60050 (all parts),
\doccite{International Electrotechnical Vocabulary (IEV)}
\item
IEC 60050-102:2007/AMD3:2021,
\doccite{Amendment 3 --- International Electrotechnical Vocabulary (IEV) ---
Part 102: Mathematics --- General concepts and linear algebra}
\item
IEC 60050-112:2010/AMD2:2020,
\doccite{Amendment 2 --- International Electrotechnical Vocabulary (IEV) ---
Part 112: Quantities and units}
\end{itemize}

\pnum
N4892 is hereinafter called \defn{\Cpp{}}.

\pnum
IEC 60050 is hereinafter called \defn{IEV}.
\indextext{references|)}


\rSec0[defs]{Terms and definitions}

\pnum
\indextext{definitions|(}%
For the purposes of this document,
the terms and definitions given in
\Cpp{},
IEC 60050-102:2007/AMD3:2021,
IEC 60050-112:2010/AMD2:2020,
the terms, definitions, and symbols given in
ISO 80000-2:2019,
and the following apply.

\pnum
ISO and IEC maintain terminology databases
for use in standardization
at the following addresses:
\begin{itemize}
\item ISO Online browsing platform: available at \url{https://www.iso.org/obp}
\item IEC Electropedia: available at \url{http://www.electropedia.org}
\end{itemize}

\pnum
Terms that are used only in a small portion of this document
are defined where they are used and italicized where they are defined.

\indexdefn{modulo}%
\definition{modulo}{def.mod}
operation performed on a set for which a division\irefiev{102-01-21} and an addition are defined,
JohelEGP marked this conversation as resolved.
Show resolved Hide resolved
the result of which, for elements $a$ and $b$ of the set,
is the unique element $r$, if it exists in the set,
such that $a = \lfloor a/b \rfloor b + r$
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is not consistent with how modulo operation on quantities works.

Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Shouldn't we use https://eel.is/c++draft/expr.mul#4 instead of redefining the operation?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is not consistent with how modulo operation on quantities works.

I think you're referring to the cases for which the modulo of quantity was made ill-formed.
This term modulo is used by a concept which already checks for its validity.
And when it is valid, it better behaves like this.

Shouldn't we use https://eel.is/c++draft/expr.mul#4 instead of redefining the operation?

I did consider that.
I saw value in phrasing it like division.
That's certainly correct,
and doesn't run the risk of a bad specification due to saying something like
"behaves like % for integral operands".

Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Collaborator Author

@JohelEGP JohelEGP Sep 23, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you.
I think it's well defined as is.
1695486055
1695486063
1695486070
1695486074
1695486082
1695486098
q % r performs the modulo in the set that is the common type of the arguments,
so the quotient-remainder theorem holds.

It does seem surprising because q and r are mapped to the common type before the modulo,
and so a and b in the definition of modulo correspond to the value of the converted arguments.
So the quotient-remainder theorem doesn't work on the actual input arguments in code.



\rSec0[spec]{Specification}

\rSec1[spec.ext]{External}

\pnum
The specification of the mp-units library subsumes
\refcpp{description}, \refcpp{requirements}, \refcpp{concepts.equality}, and SD-8,
all assumingly amended for the context of this library.
\begin{note}
This means that, non exhaustively,
\begin{itemize}
\item \tcode{::mp_units2} is a reserved namespace, and
mpusz marked this conversation as resolved.
Show resolved Hide resolved
\item
\tcode{std::vector<mp_units::\placeholdernc{type}>}
JohelEGP marked this conversation as resolved.
Show resolved Hide resolved
is a program-defined specialization and a library-defined specialization
from the point of view of \Cpp{} and this library, respectively.
\end{itemize}
\end{note}

\pnum
The mp-units library is not part of the \Cpp{} implementation.

\rSec1[spec.cats]{Categories}

\pnum
Detailed specifications for each of the components in the library are in
\ref{\firstlibchapter}--\ref{\lastlibchapter},
as shown in \tref{lib.cats}.

\begin{floattable}{Library categories}{lib.cats}
{ll}
\topline
\hdstyle{Clause} & \hdstyle{Category} \\ \capsep
\ref{nums} & Numbers library \\
\ref{qties} & Quantities library \\
\end{floattable}

\pnum
The numbers library\iref{nums}
describes components for dealing with numbers.

\pnum
The quantities library\iref{qties}
describes components for dealing with quantities.

\rSec1[headers]{Headers}

\pnum
The mp-units library provides the
\defnx{mp-units library headers}{header!mp-units library},
shown in \tref{headers.mp.units}.

\begin{multicolfloattable}{mp-units library headers}{headers.mp.units}
{l}
\tcode{<mp_units/numbers.h>} \\
\tcode{<mp_units/quantity.h>} \\
JohelEGP marked this conversation as resolved.
Show resolved Hide resolved
\end{multicolfloattable}

\rSec1[spec.reqs]{Library-wide requirements}

\rSec2[spec.res.names]{Reserved names}

\pnum
The mp-units library reserves macro names that start with
\tcode{MP_UNITS\opt{\gterm{digit-sequence}}_}.
2 changes: 2 additions & 0 deletions docs/reference/itemdecl/.clang-format
JohelEGP marked this conversation as resolved.
Show resolved Hide resolved
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
BasedOnStyle: InheritParentConfig
ColumnLimit: 99
20 changes: 20 additions & 0 deletions docs/reference/macros_extensions.tex
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
% \newcommand{\idxmdl}[1]{#1@\CodeStylex{#1}}
\newcommand{\idxexposid}[1]{#1@\ExposStylex{#1}}

\newcommand{\indexlibraryspec}[2]{\indexlibrarymisc{#1}{\idxcode{#2}}}

\newcommand{\ExposStylex}[1]{\CodeStylex{\textit{#1}}}

\newnoteenvironment{source}{Source}{end source}

\newcommand{\dvalue}{\Fundesc{Default value}}

%% Inline non-parenthesized C++ reference
\newcommand{\refcpp}[1]{\href{https://wg21.link/#1}{\Cpp{} [#1]}}
\newcommand{\irefcpp}[1]{\nolinebreak[3] (\refcpp{#1})}
\newcommand{\refcppx}[2]{\href{https://wg21.link/#1\##2}{\Cpp{} [#1]}}
\newcommand{\irefcppx}[2]{\nolinebreak[3] (\refcppx{#1}{#2})}

%% Inline IEV reference
\newcommand{\refiev}[1]{\href{https://www.electropedia.org/iev/iev.nsf/display?openform&ievref=#1}{IEV #1}}
\newcommand{\irefiev}[1]{\nolinebreak[3] (\refiev{#1})}
Loading
Loading