106 Commits

Author SHA1 Message Date
Anton Bachin
07fef34465 Not assuming bash in testing scripts. 2015-07-02 10:56:37 -05:00
Anton Bachin
3c3733c700 Support for testing in AppVeyor.
Tests are run for VC2010, VC2012, VC2013, VC2015.
2015-07-01 23:58:23 -05:00
Anton Bachin
ba9139e075 Switched to CMake for building tests.
To run tests with the system compiler, execute

    make

To run tests with the system compiler in all configurations,

    make default-all

To re-generate the examples from the documentation Markdown, and then
test all configurations,

    make default-thorough

Other Makefile targets are for exhaustive testing with multiple
locally-installed compilers, or for use on CI servers, and are not for
general use.

Python and CxxTest are still required. On Windows, it is helpful to
have a Cygwin environment with a non-Cygwin CMake, and MSBuild.exe
should be in PATH.

Better Enums is now tested in fewer configurations. C++11 features are
no longer tested on clang 3.3, gcc 4.3-4.6, because CMake claims
(apparently falsely, in some cases) that those compilers don't support
constexpr and enum class.
2015-07-01 15:18:48 -05:00
Anton Bachin
535f7f151b Fixed char16_t and char32_t detection for clang.
These are now only assumed in C++11 mode. long long is also assumed
only in C++11 mode for clang, which may make some programs that rely on
long long as an extension in C++98 fail with Better Enums. I will solve
that at a later date if it becomes a problem.
2015-07-01 15:11:29 -05:00
Alexander Buddenbrock
54b7a054be Only apply the Cygwin fix on Windows.
The so called 'cygwin_fix_command' replaces all instances of '/home'
with 'C:/cygwin/home'. This will cause the tests to fail on linux as
this directory does not exist there.
2015-06-27 18:30:03 -05:00
Anton Bachin
faf3676fec Made it easier to generate offline documentation.
Documentation can be generated by going to doc/ and running "make".
This requires Python. Before this change, the user had to install the
mistune library, which is used by the generator. The mistune library is
now included in the Better Enums distribution.

The generated docs are available at doc/html/index.html. Note that some
links won't be local (the GitHub repo, the download link, outgoing
links to MSDN, tutorial source in the GitHub repo, and so on). All the
pages belonging to the actual docs will be local, however.

The online version of the docs can be generated by running "make web".
The only difference between the online and offline versions is that the
former includes Google Analytics tracking code, and may include social
communication buttons, comment section, or other useless things in the
future.

Also included errata since the last release.

Resolves #2.
2015-06-27 13:56:27 -05:00
Anton Bachin
9a02379937 Updated README. 2015-06-20 17:00:49 -05:00
Anton Bachin
f5f669277a Updated documentation. 0.10.0 2015-06-20 13:11:56 -05:00
Anton Bachin
d90bfd6f18 Fixed some warnings with strict flags. 2015-06-20 11:50:26 -05:00
Anton Bachin
9810dd07ce Changed _size to a function.
An alternative constant _size_constant is provided for use in C++98,
for example for declaring arrays.

Also renamed underlying_traits to integral_mapping.
2015-06-19 17:05:33 -05:00
Anton Bachin
aa34aad468 Simplified underlying type traits.
Removed the function are_equal. Comparison is now done by converting
operands to their integral representation, and comparing those. Also
restored ordering of enum values along the same lines (according to
integral representation).
2015-06-15 19:29:39 -05:00
Anton Bachin
a493e90ac4 Initialization now always completed before main.
Before this change, in C++98 and C++11 "fast" mode, initializer
trimming was done "lazily" the first time _to_string or _names was
called. To make performance more "predictable", an object with static
storage is now used to force initializaton during program start-up,
when static object constructors are called.

The benefit of this change is very debatable. I had to give the static
object static linkage to avoid duplicate symbols, so there is a copy
now in each translation unit. I hope this does not increase code size
too much in realistic scenarios.

Lazy initialization checks are still performed and cannot be removed,
because other objects with static storage may try to use an enum from
their constructors before the enum's initialization is forced.
2015-06-15 18:32:57 -05:00
Anton Bachin
fc609e58aa Internal clean-up. 2015-06-15 10:48:05 -05:00
Anton Bachin
74b3a66284 Eliminated dynamic allocation.
When compile-time stringized constant name trimming is disabled (off by
default), trimming happens "lazily" - the first time the user calls a
function such as _to_string, the function allocates space for trimmed
constant names and trims them there.

With this change, space is reserved statically in a writeable char
array, and trimming happens in that array instead.
2015-06-13 16:22:07 -05:00
Anton Bachin
98232ee4fb Made enum.h build with exceptions disabled.
Throwing functions are simply omitted.
2015-06-12 17:17:41 -05:00
Anton Bachin
7502ae3c18 Included enum type names in exception messages. 2015-06-12 14:06:59 -05:00
Anton Bachin
11a1c26494 Internal improvements to stream operators. 2015-06-12 12:56:51 -05:00
Anton Bachin
0f63667106 Overloaded stream operators.
To avoid paying the huge penalty of including iostream and string for
users that don't need those headers, and to avoid creating a second,
optional header file, I resorted to defining the operators as templates
to prevent type checking until the user tries to actually use them. The
stream types and strings are wrapped in a metafunction that depends on
the template parameter. This is basically a hack, but it seems to work.
2015-06-11 23:05:46 -05:00
Anton Bachin
4314ad3fd3 Experimental generalization of underlying types.
With this change, the underlying type can be a non-integral type that
provides conversions to and from an integral type. See the test at
test/cxxtest/underlying.h for some examples - though they are more
verbose than strictly necessary, for testing needs.

Move constructors in underlying types are not supported. It has been
difficult so far to get constexpr code not to select the move
constructor, which is generally not constexpr, for various operations.
2015-06-11 20:39:46 -05:00
Anton Bachin
b037d8b5eb Improved test.py to for multiple test files and Cygwin. 2015-06-10 15:58:32 -05:00
Anton Bachin
5edcb3e121 Made ENUM usable in namespaces. 2015-06-07 17:05:31 -05:00
Anton Bachin
97197088fe Updated contact information and other errata. 2015-06-06 13:54:40 -05:00
Anton Bachin
820fd22b5f Added CONTRIBUTING file and acknowledgements. 2015-06-05 21:57:33 -05:00
Anton Bachin
41508fb114 Eliminated underscored internal macro names.
Also made a few documentation changes.
2015-06-05 19:20:18 -05:00
Anton Bachin
b24d155b7b Updated and improved documentation. 0.9.0 2015-06-05 13:01:28 -05:00
Anton Bachin
3a316e6f79 Made the test script use only the system compiler by default and extended some
support to VC++.

The unit test is currently not being run on VC++ due to a problem with CxxTest,
Cygwin, and paths. However, the examples are being compiled and having their
output checked, and the multiple translation unit test is being run.

Running "(cd test ; ./test.py)" should now run tests only using the default
compiler, on a Unix-like system. test.py --all runs tests on the full array of
compilers that I have installed and symlinked on my development machines.
2015-05-27 18:40:39 -05:00
Anton Bachin
ccc7858f14 Ported to Microsoft Visual Studio.
Worked around a bug with vararg macro expansion in VC++ and tested with Visual
Studio 2013. This commit does not include exhaustive tests for that compiler as
for clang and gcc. They are coming in a follow-on commit.

https://connect.microsoft.com/VisualStudio/feedback/details/521844/variadic-macro-treating-va-args-as-a-single-parameter-for-other-macros
2015-05-27 13:20:14 -05:00
Anton Bachin
2acb5743fa Complete documentation and testing overhaul.
The documentation is now generated from markdown. Samples are generated from the
tutorial pages. Testing is done by a Python script which runs the tests for a
large number of compilers.

This version is not very developer-friendly - the Python scripts need ways of
limiting what compilers they try to run. If you don't have 15 compilers
installed, you won't be able to run the tests in this commit. Fix coming soon.
2015-05-27 09:58:34 -05:00
Anton Bachin
a9ddc59808 Simplified enum.h.
This patch contains several minor changes.
- Eliminated the use of a deleted constructor in C++11. C++98 private default
  constructor is sufficient.
- Eliminated old namespace _enum and merged it with namespace better_enums.
- Prefixed size_t with std:: to comply with standards more strictly.
- Shortened feature control macros by deleting the word "FORCE".

Also moved make_macros.py.
2015-05-27 09:12:41 -05:00
Anton Bachin
a757e27891 Rewrote unit tests to work for multiple configurations. 2015-05-27 09:05:10 -05:00
Anton Bachin
b4be7537b6 Fixed bug with missing constructor deletion, removed reference to nullptr. 2015-05-27 09:05:10 -05:00
Anton Bachin
1ad787f94a Renamed some constants and pp_map_gen.py. 2015-05-27 09:05:10 -05:00
Anton Bachin
e784f0c860 Made enum class (strict) conversion opt-in on a global basis.
This makes C++98 and C++11 Better Enums fully compatible by default. If the user
defines BETTER_ENUMS_FORCE_STRICT_CONVERSION before including enum.h, it is
necessary to prefix enum constants in switch cases with '+', but Better Enums
are not implicitly convertible to integers.
2015-05-27 09:02:27 -05:00
Anton Bachin
5ce9537d66 Made all-constexpr (slow) enums an opt-in feature. 2015-05-27 09:02:27 -05:00
Anton Bachin
156b9d9b04 Used explicit inline functions to simplify type hierarchy, also simplified iterables names. 2015-05-27 09:00:19 -05:00
Anton Bachin
d0e4d9ffaa Fixed problem with multiple compilation units under C++98. 2015-05-27 08:57:45 -05:00
Anton Bachin
6bcca9bc8c Refactored using more higher-order macros. 2015-05-27 08:54:50 -05:00
Anton Bachin
96c274a708 Made comparison operators global to simplify them. 2015-05-27 08:47:18 -05:00
Anton Bachin
d01aacd454 Prefixed .to_* methods with underscores to avoid name conflicts. 2015-05-27 08:47:17 -05:00
Anton Bachin
5d27fd83cf Fixed incorrect definition of optional::operator ->. 2015-05-27 08:47:17 -05:00
Anton Bachin
a2d738a913 Renamed remaining uppercased types in public interface to lowercase. 2015-05-27 08:47:17 -05:00
Ben Alex
832dad561f Modifications to support aggressive compiler warning levels.
These modifications ensure enum.h can be used in a wider
selection of end user projects without triggering warnings.

GCC 4.9.2 was used with the following warning flags set:

-Wall -Wextra -Wshadow -Weffc++ -Wno-unused-parameter
-Wno-unused-local-typedefs -Wno-long-long -Wstrict-aliasing
-Werror -pedantic -std=c++1y -Wformat=2 -Wmissing-include-dirs
-Wsync-nand -Wuninitialized -Wconditionally-supported -Wconversion
-Wuseless-cast -Wzero-as-null-pointer-constant

This commit includes the modifications required to enable successful
use of enum.h via both the "test" and "example" directories.
2015-05-27 14:18:12 +10:00
Anton Bachin
f74de74604 Port to C++98 with variadic macros.
enum.h tries to automatically detect whether it is running with C++11 support.
If not, it emits alternative code that is supposed to work on compilers
supporting C++98 and variadic macros. This code is largely interface-compatible
with the C++11 code, with the following semantic differences:

- No compile-time stringization. This is done upon first use of a function other
  than to_integral.
- Implicit conversion to integral types. This is due to the lack of enum class
  support.
- The values _name, _names, _values are replaced with functions _name_, _names_,
  _values_.
2015-05-19 16:22:06 -05:00
Anton Bachin
1b3d1cc784 Forbade nearly all implicit conversions to integral types.
Each Better Enum now has an internal enum class type to which it is convertible,
instead of being convertible to the regular enum that defines its constants.
switch statements are compiled at the enum class type. This comes at the price
of the user having to type +Enum::Constant instead of Enum::Constant in cases,
in order to trigger an explicit promotion of the pre-C++11 enum to Better Enum,
so it can then be implicitly converted to the enum class.

The remaining "hole" is that direct references to constants (Enum::Constant) are
still implicitly convertible to integral types, because they have naked
pre-C++11 enum type.
2015-05-18 19:56:17 -05:00
Anton Bachin
08dbe47edd Added non-throwing versions of enum introduction functions.
These return values of an optional type better_enums::optional<T>. This type is
defined in the spirit of boost::optional<T> and std::optional<T>, but is easy to
manipulate at compile time. Two additional macros BETTER_ENUMS_USE_OPTIONAL and
BETTER_ENUMS_EXTRA_INCLUDE are honored, whose intent is for the user to be able
to inject an alternative option type. However, there are currently no viable
alternatives. boost::optional<T> does not play well with constexpr, and I failed
to make the code compile with std::optional<T>. I did not try very hard. I
intend to support std::optional<T> in the future. Perhaps it will be the
default, when available.
2015-05-18 17:15:38 -05:00
Anton Bachin
d9bd109172 Removed range properties.
They can now be easily computed using the random access iterators. There appears
to be a slight performance improvement.
2015-05-18 09:29:35 -05:00
Anton Bachin
1cfe53e827 Option to opt in to implicit conversion to enum class instead of enum.
A Better Enum is normally implicitly convertible to its internal enum type,
which makes it then implicitly convertible to an integer as well. The former
conversion is necessary for Better Enums to be usable in switch statements.
This change makes it possible to define BETTER_ENUMS_SAFER_SWITCH, which makes
Better Enums convert to an enum class, preventing the implicit conversion to
integers. The drawback is that switch cases have to be written as

    case Enum::_Case::A:

instead of

    case Enum::A:
2015-05-18 00:53:00 -05:00
Anton Bachin
10c9977a9c Minimally updated documentation. 2015-05-17 22:49:24 -05:00
Anton Bachin
6c60edcc46 Subscript operator for iterables and tests for constexpr iterators. 2015-05-17 22:13:44 -05:00
Anton Bachin
14bc834f7d Made to_string conversion constexpr and removed the last of the weak symbols.
The interface is now uniformly constexpr, including to_string and the _names
iterable. Without the weak symbol, the remaining code is also entirely standard
C++.

The compile-time string trimming code in this commit has a negative impact on
performance. The performance test is now twice as slow as including <iostream>,
whereas before it was faster. That test declares an excessive number of enums,
though, so perhaps in typical usage, and with some future optimizations, the
impact will not be so significant.

There may be other ways to solve this, such as providing a version of the macro
that does not trim strings at compile time, but only checks if they need
trimming. If some string does need trimming, that macro would fail a
static_assert and ask the user to use the slow macro.
2015-05-17 21:29:26 -05:00