-
Notifications
You must be signed in to change notification settings - Fork 160
C++ Library Status
The list below, organized by header file, gives more details about how much of the C++ library is currently available and what parts remain to be implemented relative to the 1998 standard (with additional information about C++ 2011 support where appropriate). It also contains a few implementation notes that may be of interest to some users. This list is intended to be a reference for OWCPPLIB users and serve as a TODO list for potential contributors.
All of header files of the C++ 2011 standard are listed here, and all of these header files exist in the Open Watcom distribution. Many of the C++ 2011 headers are little more than placeholders at this time. They do allow programs that include those headers to compile, although in many cases none of the C++ 2011 content is actually available. It is our hope that will change in time.
The following algorithms, shown in the order in which they appear in the C++ 2011 standard, are
missing from algorithm
and are currently unimplemented. This list is complete in the sense
that all other algorithms as specified by the 2011 standard should be present. Algorithms that
are specific to C++ 2011 are shown with a [2011]
prefix.
[2011] is_permutation( Forward1, Forward1, Forward2 )
[2011] is_permutation( Forward1, Forward1, Forward2, Predicate )
[2011] copy_n( Input, Size, Output )
[2011] copy_if( Input, Input, Output, Predicate )
[2011] move( Input, Input, Output )
[2011] move_backward( Bidirectional1, Bidirectional1, Bidirectional2 )
rotate( Forward, Forward, Forward )
rotate_copy( Forward, Forward, Forward, Output )
random_shuffle( RandomAccess, RandomAccess )
random_shuffle( RandomAccess, RandomAccess, RandomNumberGenerator)
[2011] is_partitioned( Input, Input, Predicate )
partition( Forward, Forward, Predicate )
stable_partition( Bidirectional, Bidirectional, Predicate )
[2011] partition_copy( Input, Input, Output1, Output2, Predicate )
[2011] partition_point( Forward, Forward, Predicate )
stable_sort( RandomAccess, RandomAccess )
stable_sort( RandomAccess, RandomAccess, Compare )
partial_sort( RandomAccess, RandomAccess, RandomAccess )
partial_sort( RandomAccess, RandomAccess, RandomAccess, Compare )
partial_sort_copy( Input, Input, RandomAccess, RandomAccess )
partial_sort_copy( Input, Input, RandomAccess, RandomAccess, Compare )
[2011] is_sorted( Forward, Forward )
[2011] is_sorted( Forward, Forward, Compare )
[2011] is_sorted_until( Forward, Forward )
[2011] is_sorted_until( Forward, Forward, Compare )
nth_element( RandomAccess, RandomAccess, RandomAccess )
nth_element( RandomAccess, RandomAccess, RandomAccess, Compare )
lower_bound( Forward, Forward, const T& )
lower_bound( Forward, Forward, const T&, Compare )
upper_bound( Forward, Forward, const T& )
upper_bound( Forward, Forward, const T& , Compare )
equal_range( Forward, Forward, const T& )
equal_range( Forward, Forward, const T&, Compare )
merge( Input1, Input1, Input2, Input2, Output result )
merge( Input1, Input1, Input2, Input2, Output result, Compare )
[2011] inplace_merge( Bidirectional, Bidirectional, Bidirectional )
[2011] inplace_merge( Bidirectional, Bidirectional, Bidirectional, Compare )
includes( Input1, Input1, Input2, Input )
includes( Input1, Input1, Input2, Input2, Compare )
set_union( Input1, Input1, Input2, Input2, Output )
set_union( Input1, Input1, Input2, Input2, Output, Compare )
set_intersection( Input1, Input1, Input2, Input2, Output )
set_intersection( Input1, Input1, Input2, Input2, Output, Compare )
set_difference( Input1, Input1, Input2, Input2, Output )
set_difference( Input1, Input1, Input2, Input2, Output, Compare )
set_symmetric_difference( Input1, Input1, Input2, Input2, Output )
set_symmetric_difference( Input1, Input1, Input2, Input2, Output, Compare )
[2011] is_heap( RandomAccess, RandomAccess )
[2011] is_heap( RandomAccess, RandomAccess, Compare )
[2011] is_heap_until( RandomAccess, RandomAccess )
[2011] is_heap_until( RandomAccess, RandomAccess, Compare )
[2011] min( initializer_list )
[2011] min( initializer_list, Compare )
[2011] max( initializer_list )
[2011] max( initializer_list, Compare )
[2011] minmax( const T& )
[2011] minmax( const T&, Compare )
[2011] minmax( initializer_list )
[2011] minmax( initializer_list, Compare )
[2011] minmax_element( Forward, Forward )
[2011] minmax_element( Forward, Forward, Compare )
The OWCPPLIB implementation of unique
does not follow the precise letter of the 1998 standard.
This is common since the standard is defective in this regard. See "Unique effects unclear when
predicate not an equivalence
relation" in the WG21 library
defects list. The Open Watcom library follows the proposed resolution in the defect report. For
maximum portability avoid using unique with a non-equivalence relation.
The OWCPPLIB's implementation of sort
uses a QuickSort with a median-of-three pivioting
scheme. It is recursive and thus uses O(log(N)) stack space (in the average case).
Not implemented.
Not implemented.
Mostly complete.
Not implemented.
Not implemented.
Mostly complete. No I/O operators for std::complex
have been implemented but essentially all
of the operations exist. This code needs to be reviewed by someone well versed in numerical
methods.
Not implemented.
Partially complete. Enough functionality exists to be useful but many member functions are missing. The following methods are missing:
assign(size_type, const T& )
clear()
deque(InputIterator, InputIterator, const Allocator&)
erase(iterator, iterator)
insert(iterator, const T&)
insert(iterator, size_type, const T&)
operator=(const deque&)
swap(deque&)
template assign(InputIterator, InputIterator)
template insert (iterator, InputIterator, InputIterator)
Mostly complete.
Mostly complete.
The old-style IOStreams library is in namespace std
.
Complete.
Not implemented.
Not implemented.
The old-style IOStreams library is in namespace std
.
The old-style IOStreams library is in namespace std
.
The old-style IOStreams library is in namespace std
.
The old-style IOStreams library is in namespace std
.
The old-style IOStreams library is in namespace std
.
Mostly complete. The only significant missing components are the stream iterators. These will be added once the new IOStreams library is sufficiently mature.
Mostly complete. Support for numeric_limits
on the floating point types is marginal and not
complete. The current implementation of limits is based on the macros in the C header limits.h.
Including limits will cause limits.h to also be included, bringing the macros it defines into
view. This may not be desirable. However, this approach also means that corrections to limits.h
are automatically applied to limits as well.
Partially complete. Enough functionality exists to be useful. The following methods are missing:
back( ) const;
front( ) const;
max_size( ) const
merge( list& , Compare )
remove_if( Predicate )
resize(size_type, T = T())
template <InputIterator> ctor
unique( BinaryPredicate )
unique( )
Not implemented.
Partially complete. Enough functionality exists to be useful. The following methods are missing:
const_reverse_iterator
count( )
equal_range( key_type ) and equal_range( key_type ) const
erase( iterator first, iterator last )
find( key_type ) const
key_comp( )
max_size( )
rbegin( )
rbegin( ) const
rend( )
rend( ) const
reverse_iterator
swap
template<InputIterator> ctor
value_comp( )
Mostly complete. Note that (among other things) std::auto_ptr
is not 100% compliant with the
standard, although it should be close enough for some applications. The C++ 2011 smart pointer
templates are partially complete. In particular, std::unique_ptr
is not yet implemented.
Not implemented.
Mostly complete.
Complete.
The old-style IOStreams library is in namespace std
.
Complete.
Partially complete.
Not implemented.
Not implemented.
Partially complete. Enough functionality exists to be useful.
The old-style IOStreams library is in namespace std
.
Complete.
Mostly complete.
The old-style IOStreams library is in namespace std
.
Mostly complete. Although there are no I/O operators, all other member functions and string
operations are available. OWCPPLIB's std::string
implementation is not a copy-on-write
implementation. The OWCPPLIB developer's documentation (part of the source distribution) discuss
the reasons for this in more detail.
String objects always have a capacity that is a power of two in size. When the capacity is
increased (for example after a push_back
that fills the current buffer) the size of the
internal buffer is doubled. The smallest capacity used is eight.
OWCPPLIB's std::string
do not bother to null terminate their internal buffers. When c_str
is
called, a null character is appended to the buffer at that time. At all times there will be
space for a null character. Thus, c_str
never causes a reallocation and never throws an
exception.
The old-style IOStreams library is in namespace std
.
Not implemented.
Not implemented.
Not implemented.
Not implemented.
Partially complete. Some features require compiler enhancements.
Partially complete. Some features require compiler enhancements.
Not implemented.
Not implemented.
Complete.
Not implemented.
Partially complete. Enough functionality exists to be useful. Some member functions are known to not yet be exception safe.
- Welcome
- Building
- Open Watcom Documentation
- Notes
- Relicensing effort
- Debugging
- OW tools usage Overview
- OW tools usage with CMake
- OW tools usage with Visual Studio Code
- Open Watcom 1.9 Wiki
OW Development
WGML Development
- WGML
- Augmented Devices
- Binary Device Files
- Common File Blocks
- COP Files
- Device File Blocks
- Device Function Language
- Device Function Notes
- Device Functions
- Directory File Format
- Drawing Boxes
- Driver File Blocks
- File and Directory Names
- Font File Blocks
- Fonts
- GML Tag Notes
- Keyword Statistics
- Macros and User Defined Tags
- Meta Data
- Page Layout Subsystem
- Search Paths
- Sequencing
- System Symbol Notes
- Tabs and Tabbing
- whpcvt Utility interaction