Skip to content

Commit 1a28613

Browse files
author
svorenova
committed
Move mathematical types from std_types
1 parent 2c05b3a commit 1a28613

8 files changed

+190
-156
lines changed

src/util/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ SRC = arith_tools.cpp \
4141
json_stream.cpp \
4242
lispexpr.cpp \
4343
lispirep.cpp \
44+
mathematical_types.cpp \
4445
memory_info.cpp \
4546
merge_irep.cpp \
4647
message.cpp \

src/util/mathematical_types.cpp

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/*******************************************************************\
2+
3+
Module: Mathematical types
4+
5+
Author: Daniel Kroening, [email protected]
6+
Maria Svorenova, [email protected]
7+
8+
\*******************************************************************/
9+
10+
/// \file
11+
/// Mathematical types
12+
13+
#include "mathematical_types.h"
14+
15+
/// Returns true if the type is a rational, real, integer, natural, complex,
16+
/// unsignedbv, signedbv, floatbv or fixedbv.
17+
bool is_number(const typet &type)
18+
{
19+
const irep_idt &id = type.id();
20+
return id == ID_rational || id == ID_real || id == ID_integer ||
21+
id == ID_natural || id == ID_complex || id == ID_unsignedbv ||
22+
id == ID_signedbv || id == ID_floatbv || id == ID_fixedbv;
23+
}

src/util/mathematical_types.h

Lines changed: 162 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
1+
/*******************************************************************\
2+
3+
Module: Mathematical types
4+
5+
Author: Daniel Kroening, [email protected]
6+
Maria Svorenova, [email protected]
7+
8+
\*******************************************************************/
9+
10+
/// \file
11+
/// Mathematical types
12+
13+
#ifndef CPROVER_UTIL_MATHEMATICAL_TYPES_H
14+
#define CPROVER_UTIL_MATHEMATICAL_TYPES_H
15+
16+
#include "expr_cast.h"
17+
#include "invariant.h"
18+
#include "type.h"
19+
20+
/// Unbounded, signed integers (mathematical integers, not bitvectors)
21+
class integer_typet : public typet
22+
{
23+
public:
24+
integer_typet() : typet(ID_integer)
25+
{
26+
}
27+
};
28+
29+
/// Natural numbers including zero (mathematical integers, not bitvectors)
30+
class natural_typet : public typet
31+
{
32+
public:
33+
natural_typet() : typet(ID_natural)
34+
{
35+
}
36+
};
37+
38+
/// Unbounded, signed rational numbers
39+
class rational_typet : public typet
40+
{
41+
public:
42+
rational_typet() : typet(ID_rational)
43+
{
44+
}
45+
};
46+
47+
/// Unbounded, signed real numbers
48+
class real_typet : public typet
49+
{
50+
public:
51+
real_typet() : typet(ID_real)
52+
{
53+
}
54+
};
55+
56+
/// A type for mathematical functions (do not confuse with functions/methods
57+
/// in code)
58+
class mathematical_function_typet : public typet
59+
{
60+
public:
61+
// the domain of the function is composed of zero, one, or
62+
// many variables
63+
class variablet : public irept
64+
{
65+
public:
66+
// the identifier is optional
67+
irep_idt get_identifier() const
68+
{
69+
return get(ID_identifier);
70+
}
71+
72+
void set_identifier(const irep_idt &identifier)
73+
{
74+
return set(ID_identifier, identifier);
75+
}
76+
77+
typet &type()
78+
{
79+
return static_cast<typet &>(add(ID_type));
80+
}
81+
82+
const typet &type() const
83+
{
84+
return static_cast<const typet &>(find(ID_type));
85+
}
86+
};
87+
88+
using domaint = std::vector<variablet>;
89+
90+
mathematical_function_typet(const domaint &_domain, const typet &_codomain)
91+
: typet(ID_mathematical_function)
92+
{
93+
subtypes().resize(2);
94+
domain() = _domain;
95+
codomain() = _codomain;
96+
}
97+
98+
domaint &domain()
99+
{
100+
return (domaint &)subtypes()[0].subtypes();
101+
}
102+
103+
const domaint &domain() const
104+
{
105+
return (const domaint &)subtypes()[0].subtypes();
106+
}
107+
108+
variablet &add_variable()
109+
{
110+
auto &d = domain();
111+
d.push_back(variablet());
112+
return d.back();
113+
}
114+
115+
/// Return the codomain, i.e., the set of values that the function maps to
116+
/// (the "target").
117+
typet &codomain()
118+
{
119+
return subtypes()[1];
120+
}
121+
122+
/// \copydoc codomain()
123+
const typet &codomain() const
124+
{
125+
return subtypes()[1];
126+
}
127+
};
128+
129+
/// Check whether a reference to a typet is a \ref mathematical_function_typet.
130+
/// \param type Source type.
131+
/// \return True if \param type is a \ref mathematical_function_typet.
132+
template <>
133+
inline bool can_cast_type<mathematical_function_typet>(const typet &type)
134+
{
135+
return type.id() == ID_mathematical_function;
136+
}
137+
138+
/// \brief Cast a typet to a \ref mathematical_function_typet
139+
///
140+
/// This is an unchecked conversion. \a type must be known to be \ref
141+
/// mathematical_function_typet. Will fail with a precondition violation if type
142+
/// doesn't match.
143+
///
144+
/// \param type Source type.
145+
/// \return Object of type \ref mathematical_function_typet.
146+
inline const mathematical_function_typet &
147+
to_mathematical_function_type(const typet &type)
148+
{
149+
PRECONDITION(can_cast_type<mathematical_function_typet>(type));
150+
return static_cast<const mathematical_function_typet &>(type);
151+
}
152+
153+
/// \copydoc to_mathematical_function_type(const typet &)
154+
inline mathematical_function_typet &to_mathematical_function_type(typet &type)
155+
{
156+
PRECONDITION(can_cast_type<mathematical_function_typet>(type));
157+
return static_cast<mathematical_function_typet &>(type);
158+
}
159+
160+
bool is_number(const typet &type);
161+
162+
#endif // CPROVER_UTIL_MATHEMATICAL_TYPES_H

src/util/simplify_expr_int.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ Author: Daniel Kroening, [email protected]
1818
#include "fixedbv.h"
1919
#include "ieee_float.h"
2020
#include "invariant.h"
21+
#include "mathematical_types.h"
2122
#include "namespace.h"
2223
#include "pointer_offset_size.h"
2324
#include "rational.h"

src/util/std_expr.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,10 @@ Author: Daniel Kroening, [email protected]
1313
/// \file util/std_expr.h
1414
/// API to expression classes
1515

16+
#include "expr_cast.h"
1617
#include "invariant.h"
18+
#include "mathematical_types.h"
1719
#include "std_types.h"
18-
#include "expr_cast.h"
19-
2020

2121
/// Transition system, consisting of state invariant, initial state predicate,
2222
/// and transition predicate.

src/util/std_types.cpp

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -197,16 +197,6 @@ constant_exprt unsignedbv_typet::largest_expr() const
197197
return from_integer(largest(), *this);
198198
}
199199

200-
/// Returns true if the type is a rational, real, integer, natural, complex,
201-
/// unsignedbv, signedbv, floatbv or fixedbv.
202-
bool is_number(const typet &type)
203-
{
204-
const irep_idt &id = type.id();
205-
return id == ID_rational || id == ID_real || id == ID_integer ||
206-
id == ID_natural || id == ID_complex || id == ID_unsignedbv ||
207-
id == ID_signedbv || id == ID_floatbv || id == ID_fixedbv;
208-
}
209-
210200
/// Identify whether a given type is constant itself or contains constant
211201
/// components.
212202
/// Examples include:

src/util/std_types.h

Lines changed: 0 additions & 143 deletions
Original file line numberDiff line numberDiff line change
@@ -56,42 +56,6 @@ class void_typet:public empty_typet
5656
{
5757
};
5858

59-
/// Unbounded, signed integers (mathematical integers, not bitvectors)
60-
class integer_typet:public typet
61-
{
62-
public:
63-
integer_typet():typet(ID_integer)
64-
{
65-
}
66-
};
67-
68-
/// Natural numbers including zero (mathematical integers, not bitvectors)
69-
class natural_typet:public typet
70-
{
71-
public:
72-
natural_typet():typet(ID_natural)
73-
{
74-
}
75-
};
76-
77-
/// Unbounded, signed rational numbers
78-
class rational_typet:public typet
79-
{
80-
public:
81-
rational_typet():typet(ID_rational)
82-
{
83-
}
84-
};
85-
86-
/// Unbounded, signed real numbers
87-
class real_typet:public typet
88-
{
89-
public:
90-
real_typet():typet(ID_real)
91-
{
92-
}
93-
};
94-
9559
/// A reference into the symbol table
9660
class symbol_typet:public typet
9761
{
@@ -1822,113 +1786,6 @@ inline complex_typet &to_complex_type(typet &type)
18221786
return static_cast<complex_typet &>(type);
18231787
}
18241788

1825-
/// A type for mathematical functions (do not confuse with functions/methods
1826-
/// in code)
1827-
class mathematical_function_typet:public typet
1828-
{
1829-
public:
1830-
// the domain of the function is composed of zero, one, or
1831-
// many variables
1832-
class variablet:public irept
1833-
{
1834-
public:
1835-
// the identifier is optional
1836-
irep_idt get_identifier() const
1837-
{
1838-
return get(ID_identifier);
1839-
}
1840-
1841-
void set_identifier(const irep_idt &identifier)
1842-
{
1843-
return set(ID_identifier, identifier);
1844-
}
1845-
1846-
typet &type()
1847-
{
1848-
return static_cast<typet &>(add(ID_type));
1849-
}
1850-
1851-
const typet &type() const
1852-
{
1853-
return static_cast<const typet &>(find(ID_type));
1854-
}
1855-
};
1856-
1857-
using domaint=std::vector<variablet>;
1858-
1859-
mathematical_function_typet(const domaint &_domain, const typet &_codomain)
1860-
: typet(ID_mathematical_function)
1861-
{
1862-
subtypes().resize(2);
1863-
domain() = _domain;
1864-
codomain() = _codomain;
1865-
}
1866-
1867-
domaint &domain()
1868-
{
1869-
return (domaint &)subtypes()[0].subtypes();
1870-
}
1871-
1872-
const domaint &domain() const
1873-
{
1874-
return (const domaint &)subtypes()[0].subtypes();
1875-
}
1876-
1877-
variablet &add_variable()
1878-
{
1879-
auto &d=domain();
1880-
d.push_back(variablet());
1881-
return d.back();
1882-
}
1883-
1884-
/// Return the codomain, i.e., the set of values that the function maps to
1885-
/// (the "target").
1886-
typet &codomain()
1887-
{
1888-
return subtypes()[1];
1889-
}
1890-
1891-
/// \copydoc codomain()
1892-
const typet &codomain() const
1893-
{
1894-
return subtypes()[1];
1895-
}
1896-
};
1897-
1898-
/// Check whether a reference to a typet is a \ref mathematical_function_typet.
1899-
/// \param type Source type.
1900-
/// \return True if \param type is a \ref mathematical_function_typet.
1901-
template <>
1902-
inline bool can_cast_type<mathematical_function_typet>(const typet &type)
1903-
{
1904-
return type.id() == ID_mathematical_function;
1905-
}
1906-
1907-
/// \brief Cast a typet to a \ref mathematical_function_typet
1908-
///
1909-
/// This is an unchecked conversion. \a type must be known to be \ref
1910-
/// mathematical_function_typet. Will fail with a precondition violation if type
1911-
/// doesn't match.
1912-
///
1913-
/// \param type Source type.
1914-
/// \return Object of type \ref mathematical_function_typet.
1915-
inline const mathematical_function_typet &
1916-
to_mathematical_function_type(const typet &type)
1917-
{
1918-
PRECONDITION(can_cast_type<mathematical_function_typet>(type));
1919-
return static_cast<const mathematical_function_typet &>(type);
1920-
}
1921-
1922-
/// \copydoc to_mathematical_function_type(const typet &)
1923-
inline mathematical_function_typet &
1924-
to_mathematical_function_type(typet &type)
1925-
{
1926-
PRECONDITION(can_cast_type<mathematical_function_typet>(type));
1927-
return static_cast<mathematical_function_typet &>(type);
1928-
}
1929-
1930-
bool is_number(const typet &type);
1931-
19321789
bool is_constant_or_has_constant_components(
19331790
const typet &type,
19341791
const namespacet &ns);

src/util/type.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ Author: Daniel Kroening, [email protected]
2222
/// modeled with two subs named “subtype” (a single type) and “subtypes”
2323
/// (a vector of types). The class typet only adds specialized methods
2424
/// for accessing the subtype information to the interface of irept.
25-
/// For pre-defined types see `std_types.h`.
25+
/// For pre-defined types see `std_types.h` and `mathematical_types.h`.
2626
class typet:public irept
2727
{
2828
public:

0 commit comments

Comments
 (0)