Compare commits
2 Commits
| Author | SHA1 | Date |
|---|---|---|
|
|
a36e902642 | 2 years ago |
|
|
50419b103b | 2 years ago |
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1,3 @@
|
||||
{
|
||||
"server_url": "http://172.24.5.5:5202"
|
||||
}
|
||||
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,328 @@
|
||||
/*
|
||||
** License Applicability. Except to the extent portions of this file are
|
||||
** made subject to an alternative license as permitted in the SGI Free
|
||||
** Software License B, Version 1.1 (the "License"), the contents of this
|
||||
** file are subject only to the provisions of the License. You may not use
|
||||
** this file except in compliance with the License. You may obtain a copy
|
||||
** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600
|
||||
** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at:
|
||||
**
|
||||
** http://oss.sgi.com/projects/FreeB
|
||||
**
|
||||
** Note that, as provided in the License, the Software is distributed on an
|
||||
** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS
|
||||
** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND
|
||||
** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A
|
||||
** PARTICULAR PURPOSE, AND NON-INFRINGEMENT.
|
||||
**
|
||||
** Original Code. The Original Code is: OpenGL Sample Implementation,
|
||||
** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics,
|
||||
** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc.
|
||||
** Copyright in any portions created by third parties is as indicated
|
||||
** elsewhere herein. All Rights Reserved.
|
||||
**
|
||||
** Additional Notice Provisions: This software was created using the
|
||||
** OpenGL(R) version 1.2.1 Sample Implementation published by SGI, but has
|
||||
** not been independently verified as being compliant with the OpenGL(R)
|
||||
** version 1.2.1 Specification.
|
||||
*/
|
||||
|
||||
/*
|
||||
* 2002-Apr-15, Marcus Geelnard:
|
||||
* Changed GLAPIENTRY to APIENTRY.
|
||||
*/
|
||||
|
||||
#ifndef __glu_h__
|
||||
#define __glu_h__
|
||||
|
||||
#include <GL/gl.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*************************************************************/
|
||||
|
||||
/* Extensions */
|
||||
#define GLU_EXT_object_space_tess 1
|
||||
#define GLU_EXT_nurbs_tessellator 1
|
||||
|
||||
/* Boolean */
|
||||
#define GLU_FALSE 0
|
||||
#define GLU_TRUE 1
|
||||
|
||||
/* Version */
|
||||
#define GLU_VERSION_1_1 1
|
||||
#define GLU_VERSION_1_2 1
|
||||
#define GLU_VERSION_1_3 1
|
||||
|
||||
/* StringName */
|
||||
#define GLU_VERSION 100800
|
||||
#define GLU_EXTENSIONS 100801
|
||||
|
||||
/* ErrorCode */
|
||||
#define GLU_INVALID_ENUM 100900
|
||||
#define GLU_INVALID_VALUE 100901
|
||||
#define GLU_OUT_OF_MEMORY 100902
|
||||
#define GLU_INVALID_OPERATION 100904
|
||||
|
||||
/* NurbsDisplay */
|
||||
/* GLU_FILL */
|
||||
#define GLU_OUTLINE_POLYGON 100240
|
||||
#define GLU_OUTLINE_PATCH 100241
|
||||
|
||||
/* NurbsCallback */
|
||||
#define GLU_NURBS_ERROR 100103
|
||||
#define GLU_ERROR 100103
|
||||
#define GLU_NURBS_BEGIN 100164
|
||||
#define GLU_NURBS_BEGIN_EXT 100164
|
||||
#define GLU_NURBS_VERTEX 100165
|
||||
#define GLU_NURBS_VERTEX_EXT 100165
|
||||
#define GLU_NURBS_NORMAL 100166
|
||||
#define GLU_NURBS_NORMAL_EXT 100166
|
||||
#define GLU_NURBS_COLOR 100167
|
||||
#define GLU_NURBS_COLOR_EXT 100167
|
||||
#define GLU_NURBS_TEXTURE_COORD 100168
|
||||
#define GLU_NURBS_TEX_COORD_EXT 100168
|
||||
#define GLU_NURBS_END 100169
|
||||
#define GLU_NURBS_END_EXT 100169
|
||||
#define GLU_NURBS_BEGIN_DATA 100170
|
||||
#define GLU_NURBS_BEGIN_DATA_EXT 100170
|
||||
#define GLU_NURBS_VERTEX_DATA 100171
|
||||
#define GLU_NURBS_VERTEX_DATA_EXT 100171
|
||||
#define GLU_NURBS_NORMAL_DATA 100172
|
||||
#define GLU_NURBS_NORMAL_DATA_EXT 100172
|
||||
#define GLU_NURBS_COLOR_DATA 100173
|
||||
#define GLU_NURBS_COLOR_DATA_EXT 100173
|
||||
#define GLU_NURBS_TEXTURE_COORD_DATA 100174
|
||||
#define GLU_NURBS_TEX_COORD_DATA_EXT 100174
|
||||
#define GLU_NURBS_END_DATA 100175
|
||||
#define GLU_NURBS_END_DATA_EXT 100175
|
||||
|
||||
/* NurbsError */
|
||||
#define GLU_NURBS_ERROR1 100251
|
||||
#define GLU_NURBS_ERROR2 100252
|
||||
#define GLU_NURBS_ERROR3 100253
|
||||
#define GLU_NURBS_ERROR4 100254
|
||||
#define GLU_NURBS_ERROR5 100255
|
||||
#define GLU_NURBS_ERROR6 100256
|
||||
#define GLU_NURBS_ERROR7 100257
|
||||
#define GLU_NURBS_ERROR8 100258
|
||||
#define GLU_NURBS_ERROR9 100259
|
||||
#define GLU_NURBS_ERROR10 100260
|
||||
#define GLU_NURBS_ERROR11 100261
|
||||
#define GLU_NURBS_ERROR12 100262
|
||||
#define GLU_NURBS_ERROR13 100263
|
||||
#define GLU_NURBS_ERROR14 100264
|
||||
#define GLU_NURBS_ERROR15 100265
|
||||
#define GLU_NURBS_ERROR16 100266
|
||||
#define GLU_NURBS_ERROR17 100267
|
||||
#define GLU_NURBS_ERROR18 100268
|
||||
#define GLU_NURBS_ERROR19 100269
|
||||
#define GLU_NURBS_ERROR20 100270
|
||||
#define GLU_NURBS_ERROR21 100271
|
||||
#define GLU_NURBS_ERROR22 100272
|
||||
#define GLU_NURBS_ERROR23 100273
|
||||
#define GLU_NURBS_ERROR24 100274
|
||||
#define GLU_NURBS_ERROR25 100275
|
||||
#define GLU_NURBS_ERROR26 100276
|
||||
#define GLU_NURBS_ERROR27 100277
|
||||
#define GLU_NURBS_ERROR28 100278
|
||||
#define GLU_NURBS_ERROR29 100279
|
||||
#define GLU_NURBS_ERROR30 100280
|
||||
#define GLU_NURBS_ERROR31 100281
|
||||
#define GLU_NURBS_ERROR32 100282
|
||||
#define GLU_NURBS_ERROR33 100283
|
||||
#define GLU_NURBS_ERROR34 100284
|
||||
#define GLU_NURBS_ERROR35 100285
|
||||
#define GLU_NURBS_ERROR36 100286
|
||||
#define GLU_NURBS_ERROR37 100287
|
||||
|
||||
/* NurbsProperty */
|
||||
#define GLU_AUTO_LOAD_MATRIX 100200
|
||||
#define GLU_CULLING 100201
|
||||
#define GLU_SAMPLING_TOLERANCE 100203
|
||||
#define GLU_DISPLAY_MODE 100204
|
||||
#define GLU_PARAMETRIC_TOLERANCE 100202
|
||||
#define GLU_SAMPLING_METHOD 100205
|
||||
#define GLU_U_STEP 100206
|
||||
#define GLU_V_STEP 100207
|
||||
#define GLU_NURBS_MODE 100160
|
||||
#define GLU_NURBS_MODE_EXT 100160
|
||||
#define GLU_NURBS_TESSELLATOR 100161
|
||||
#define GLU_NURBS_TESSELLATOR_EXT 100161
|
||||
#define GLU_NURBS_RENDERER 100162
|
||||
#define GLU_NURBS_RENDERER_EXT 100162
|
||||
|
||||
/* NurbsSampling */
|
||||
#define GLU_OBJECT_PARAMETRIC_ERROR 100208
|
||||
#define GLU_OBJECT_PARAMETRIC_ERROR_EXT 100208
|
||||
#define GLU_OBJECT_PATH_LENGTH 100209
|
||||
#define GLU_OBJECT_PATH_LENGTH_EXT 100209
|
||||
#define GLU_PATH_LENGTH 100215
|
||||
#define GLU_PARAMETRIC_ERROR 100216
|
||||
#define GLU_DOMAIN_DISTANCE 100217
|
||||
|
||||
/* NurbsTrim */
|
||||
#define GLU_MAP1_TRIM_2 100210
|
||||
#define GLU_MAP1_TRIM_3 100211
|
||||
|
||||
/* QuadricDrawStyle */
|
||||
#define GLU_POINT 100010
|
||||
#define GLU_LINE 100011
|
||||
#define GLU_FILL 100012
|
||||
#define GLU_SILHOUETTE 100013
|
||||
|
||||
/* QuadricCallback */
|
||||
/* GLU_ERROR */
|
||||
|
||||
/* QuadricNormal */
|
||||
#define GLU_SMOOTH 100000
|
||||
#define GLU_FLAT 100001
|
||||
#define GLU_NONE 100002
|
||||
|
||||
/* QuadricOrientation */
|
||||
#define GLU_OUTSIDE 100020
|
||||
#define GLU_INSIDE 100021
|
||||
|
||||
/* TessCallback */
|
||||
#define GLU_TESS_BEGIN 100100
|
||||
#define GLU_BEGIN 100100
|
||||
#define GLU_TESS_VERTEX 100101
|
||||
#define GLU_VERTEX 100101
|
||||
#define GLU_TESS_END 100102
|
||||
#define GLU_END 100102
|
||||
#define GLU_TESS_ERROR 100103
|
||||
#define GLU_TESS_EDGE_FLAG 100104
|
||||
#define GLU_EDGE_FLAG 100104
|
||||
#define GLU_TESS_COMBINE 100105
|
||||
#define GLU_TESS_BEGIN_DATA 100106
|
||||
#define GLU_TESS_VERTEX_DATA 100107
|
||||
#define GLU_TESS_END_DATA 100108
|
||||
#define GLU_TESS_ERROR_DATA 100109
|
||||
#define GLU_TESS_EDGE_FLAG_DATA 100110
|
||||
#define GLU_TESS_COMBINE_DATA 100111
|
||||
|
||||
/* TessContour */
|
||||
#define GLU_CW 100120
|
||||
#define GLU_CCW 100121
|
||||
#define GLU_INTERIOR 100122
|
||||
#define GLU_EXTERIOR 100123
|
||||
#define GLU_UNKNOWN 100124
|
||||
|
||||
/* TessProperty */
|
||||
#define GLU_TESS_WINDING_RULE 100140
|
||||
#define GLU_TESS_BOUNDARY_ONLY 100141
|
||||
#define GLU_TESS_TOLERANCE 100142
|
||||
|
||||
/* TessError */
|
||||
#define GLU_TESS_ERROR1 100151
|
||||
#define GLU_TESS_ERROR2 100152
|
||||
#define GLU_TESS_ERROR3 100153
|
||||
#define GLU_TESS_ERROR4 100154
|
||||
#define GLU_TESS_ERROR5 100155
|
||||
#define GLU_TESS_ERROR6 100156
|
||||
#define GLU_TESS_ERROR7 100157
|
||||
#define GLU_TESS_ERROR8 100158
|
||||
#define GLU_TESS_MISSING_BEGIN_POLYGON 100151
|
||||
#define GLU_TESS_MISSING_BEGIN_CONTOUR 100152
|
||||
#define GLU_TESS_MISSING_END_POLYGON 100153
|
||||
#define GLU_TESS_MISSING_END_CONTOUR 100154
|
||||
#define GLU_TESS_COORD_TOO_LARGE 100155
|
||||
#define GLU_TESS_NEED_COMBINE_CALLBACK 100156
|
||||
|
||||
/* TessWinding */
|
||||
#define GLU_TESS_WINDING_ODD 100130
|
||||
#define GLU_TESS_WINDING_NONZERO 100131
|
||||
#define GLU_TESS_WINDING_POSITIVE 100132
|
||||
#define GLU_TESS_WINDING_NEGATIVE 100133
|
||||
#define GLU_TESS_WINDING_ABS_GEQ_TWO 100134
|
||||
|
||||
/*************************************************************/
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
class GLUnurbs;
|
||||
class GLUquadric;
|
||||
class GLUtesselator;
|
||||
#else
|
||||
typedef struct GLUnurbs GLUnurbs;
|
||||
typedef struct GLUquadric GLUquadric;
|
||||
typedef struct GLUtesselator GLUtesselator;
|
||||
#endif
|
||||
|
||||
typedef GLUnurbs GLUnurbsObj;
|
||||
typedef GLUquadric GLUquadricObj;
|
||||
typedef GLUtesselator GLUtesselatorObj;
|
||||
typedef GLUtesselator GLUtriangulatorObj;
|
||||
|
||||
#define GLU_TESS_MAX_COORD 1.0e150
|
||||
|
||||
/* Internal convenience typedefs */
|
||||
typedef void (APIENTRY *_GLUfuncptr)();
|
||||
|
||||
GLAPI void APIENTRY gluBeginCurve (GLUnurbs* nurb);
|
||||
GLAPI void APIENTRY gluBeginPolygon (GLUtesselator* tess);
|
||||
GLAPI void APIENTRY gluBeginSurface (GLUnurbs* nurb);
|
||||
GLAPI void APIENTRY gluBeginTrim (GLUnurbs* nurb);
|
||||
GLAPI GLint APIENTRY gluBuild1DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data);
|
||||
GLAPI GLint APIENTRY gluBuild1DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLenum format, GLenum type, const void *data);
|
||||
GLAPI GLint APIENTRY gluBuild2DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data);
|
||||
GLAPI GLint APIENTRY gluBuild2DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *data);
|
||||
GLAPI GLint APIENTRY gluBuild3DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data);
|
||||
GLAPI GLint APIENTRY gluBuild3DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data);
|
||||
GLAPI GLboolean APIENTRY gluCheckExtension (const GLubyte *extName, const GLubyte *extString);
|
||||
GLAPI void APIENTRY gluCylinder (GLUquadric* quad, GLdouble base, GLdouble top, GLdouble height, GLint slices, GLint stacks);
|
||||
GLAPI void APIENTRY gluDeleteNurbsRenderer (GLUnurbs* nurb);
|
||||
GLAPI void APIENTRY gluDeleteQuadric (GLUquadric* quad);
|
||||
GLAPI void APIENTRY gluDeleteTess (GLUtesselator* tess);
|
||||
GLAPI void APIENTRY gluDisk (GLUquadric* quad, GLdouble inner, GLdouble outer, GLint slices, GLint loops);
|
||||
GLAPI void APIENTRY gluEndCurve (GLUnurbs* nurb);
|
||||
GLAPI void APIENTRY gluEndPolygon (GLUtesselator* tess);
|
||||
GLAPI void APIENTRY gluEndSurface (GLUnurbs* nurb);
|
||||
GLAPI void APIENTRY gluEndTrim (GLUnurbs* nurb);
|
||||
GLAPI const GLubyte * APIENTRY gluErrorString (GLenum error);
|
||||
GLAPI void APIENTRY gluGetNurbsProperty (GLUnurbs* nurb, GLenum property, GLfloat* data);
|
||||
GLAPI const GLubyte * APIENTRY gluGetString (GLenum name);
|
||||
GLAPI void APIENTRY gluGetTessProperty (GLUtesselator* tess, GLenum which, GLdouble* data);
|
||||
GLAPI void APIENTRY gluLoadSamplingMatrices (GLUnurbs* nurb, const GLfloat *model, const GLfloat *perspective, const GLint *view);
|
||||
GLAPI void APIENTRY gluLookAt (GLdouble eyeX, GLdouble eyeY, GLdouble eyeZ, GLdouble centerX, GLdouble centerY, GLdouble centerZ, GLdouble upX, GLdouble upY, GLdouble upZ);
|
||||
GLAPI GLUnurbs* APIENTRY gluNewNurbsRenderer (void);
|
||||
GLAPI GLUquadric* APIENTRY gluNewQuadric (void);
|
||||
GLAPI GLUtesselator* APIENTRY gluNewTess (void);
|
||||
GLAPI void APIENTRY gluNextContour (GLUtesselator* tess, GLenum type);
|
||||
GLAPI void APIENTRY gluNurbsCallback (GLUnurbs* nurb, GLenum which, _GLUfuncptr CallBackFunc);
|
||||
GLAPI void APIENTRY gluNurbsCallbackData (GLUnurbs* nurb, GLvoid* userData);
|
||||
GLAPI void APIENTRY gluNurbsCallbackDataEXT (GLUnurbs* nurb, GLvoid* userData);
|
||||
GLAPI void APIENTRY gluNurbsCurve (GLUnurbs* nurb, GLint knotCount, GLfloat *knots, GLint stride, GLfloat *control, GLint order, GLenum type);
|
||||
GLAPI void APIENTRY gluNurbsProperty (GLUnurbs* nurb, GLenum property, GLfloat value);
|
||||
GLAPI void APIENTRY gluNurbsSurface (GLUnurbs* nurb, GLint sKnotCount, GLfloat* sKnots, GLint tKnotCount, GLfloat* tKnots, GLint sStride, GLint tStride, GLfloat* control, GLint sOrder, GLint tOrder, GLenum type);
|
||||
GLAPI void APIENTRY gluOrtho2D (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top);
|
||||
GLAPI void APIENTRY gluPartialDisk (GLUquadric* quad, GLdouble inner, GLdouble outer, GLint slices, GLint loops, GLdouble start, GLdouble sweep);
|
||||
GLAPI void APIENTRY gluPerspective (GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar);
|
||||
GLAPI void APIENTRY gluPickMatrix (GLdouble x, GLdouble y, GLdouble delX, GLdouble delY, GLint *viewport);
|
||||
GLAPI GLint APIENTRY gluProject (GLdouble objX, GLdouble objY, GLdouble objZ, const GLdouble *model, const GLdouble *proj, const GLint *view, GLdouble* winX, GLdouble* winY, GLdouble* winZ);
|
||||
GLAPI void APIENTRY gluPwlCurve (GLUnurbs* nurb, GLint count, GLfloat* data, GLint stride, GLenum type);
|
||||
GLAPI void APIENTRY gluQuadricCallback (GLUquadric* quad, GLenum which, _GLUfuncptr CallBackFunc);
|
||||
GLAPI void APIENTRY gluQuadricDrawStyle (GLUquadric* quad, GLenum draw);
|
||||
GLAPI void APIENTRY gluQuadricNormals (GLUquadric* quad, GLenum normal);
|
||||
GLAPI void APIENTRY gluQuadricOrientation (GLUquadric* quad, GLenum orientation);
|
||||
GLAPI void APIENTRY gluQuadricTexture (GLUquadric* quad, GLboolean texture);
|
||||
GLAPI GLint APIENTRY gluScaleImage (GLenum format, GLsizei wIn, GLsizei hIn, GLenum typeIn, const void *dataIn, GLsizei wOut, GLsizei hOut, GLenum typeOut, GLvoid* dataOut);
|
||||
GLAPI void APIENTRY gluSphere (GLUquadric* quad, GLdouble radius, GLint slices, GLint stacks);
|
||||
GLAPI void APIENTRY gluTessBeginContour (GLUtesselator* tess);
|
||||
GLAPI void APIENTRY gluTessBeginPolygon (GLUtesselator* tess, GLvoid* data);
|
||||
GLAPI void APIENTRY gluTessCallback (GLUtesselator* tess, GLenum which, _GLUfuncptr CallBackFunc);
|
||||
GLAPI void APIENTRY gluTessEndContour (GLUtesselator* tess);
|
||||
GLAPI void APIENTRY gluTessEndPolygon (GLUtesselator* tess);
|
||||
GLAPI void APIENTRY gluTessNormal (GLUtesselator* tess, GLdouble valueX, GLdouble valueY, GLdouble valueZ);
|
||||
GLAPI void APIENTRY gluTessProperty (GLUtesselator* tess, GLenum which, GLdouble data);
|
||||
GLAPI void APIENTRY gluTessVertex (GLUtesselator* tess, GLdouble *location, GLvoid* data);
|
||||
GLAPI GLint APIENTRY gluUnProject (GLdouble winX, GLdouble winY, GLdouble winZ, const GLdouble *model, const GLdouble *proj, const GLint *view, GLdouble* objX, GLdouble* objY, GLdouble* objZ);
|
||||
GLAPI GLint APIENTRY gluUnProject4 (GLdouble winX, GLdouble winY, GLdouble winZ, GLdouble clipW, const GLdouble *model, const GLdouble *proj, const GLint *view, GLdouble nearVal, GLdouble farVal, GLdouble* objX, GLdouble* objY, GLdouble* objZ, GLdouble* objW);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __glu_h__ */
|
||||
@ -0,0 +1,488 @@
|
||||
#ifndef __glut_h__
|
||||
#define __glut_h__
|
||||
|
||||
/* Copyright (c) Mark J. Kilgard, 1994, 1995, 1996. */
|
||||
|
||||
/* This program is freely distributable without licensing fees and is
|
||||
provided without guarantee or warrantee expressed or implied. This
|
||||
program is -not- in the public domain. */
|
||||
|
||||
#if defined(WIN32)
|
||||
#include <windows.h>
|
||||
#include <wingdi.h>
|
||||
#include <winuser.h>
|
||||
#pragma warning (disable:4244) /* disable bogus conversion warnings */
|
||||
#endif
|
||||
#include <GL/gl.h>
|
||||
#include <GL/glu.h>
|
||||
|
||||
/* define APIENTRY and CALLBACK to null string if we aren't on Win32 */
|
||||
#if !defined(WIN32)
|
||||
#define APIENTRY
|
||||
#define CALLBACK
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/**
|
||||
GLUT API revision history:
|
||||
|
||||
GLUT_API_VERSION is updated to reflect incompatible GLUT
|
||||
API changes (interface changes, semantic changes, deletions,
|
||||
or additions).
|
||||
|
||||
GLUT_API_VERSION=1 First public release of GLUT. 11/29/94
|
||||
|
||||
GLUT_API_VERSION=2 Added support for OpenGL/GLX multisampling,
|
||||
extension. Supports new input devices like tablet, dial and button
|
||||
box, and Spaceball. Easy to query OpenGL extensions.
|
||||
|
||||
GLUT_API_VERSION=3 glutMenuStatus added.
|
||||
|
||||
GLUT_API_VERSION=4 glutInitDisplayString, glutWarpPointer,
|
||||
glutBitmapLength, glutStrokeLength, glutWindowStatusFunc, dynamic
|
||||
video resize subAPI, glutPostWindowRedisplay (NOT FINALIZED!).
|
||||
**/
|
||||
#ifndef GLUT_API_VERSION /* allow this to be overriden */
|
||||
#define GLUT_API_VERSION 3
|
||||
#endif
|
||||
|
||||
/**
|
||||
GLUT implementation revision history:
|
||||
|
||||
GLUT_XLIB_IMPLEMENTATION is updated to reflect both GLUT
|
||||
API revisions and implementation revisions (ie, bug fixes).
|
||||
|
||||
GLUT_XLIB_IMPLEMENTATION=1 mjk's first public release of
|
||||
GLUT Xlib-based implementation. 11/29/94
|
||||
|
||||
GLUT_XLIB_IMPLEMENTATION=2 mjk's second public release of
|
||||
GLUT Xlib-based implementation providing GLUT version 2
|
||||
interfaces.
|
||||
|
||||
GLUT_XLIB_IMPLEMENTATION=3 mjk's GLUT 2.2 images. 4/17/95
|
||||
|
||||
GLUT_XLIB_IMPLEMENTATION=4 mjk's GLUT 2.3 images. 6/?/95
|
||||
|
||||
GLUT_XLIB_IMPLEMENTATION=5 mjk's GLUT 3.0 images. 10/?/95
|
||||
|
||||
GLUT_XLIB_IMPLEMENTATION=7 mjk's GLUT 3.1+ with glutWarpPoitner. 7/24/96
|
||||
|
||||
GLUT_XLIB_IMPLEMENTATION=8 mjk's GLUT 3.1+ with glutWarpPoitner
|
||||
and video resize. 1/3/97
|
||||
|
||||
GLUT_XLIB_IMPLEMENTATION=9 mjk's GLUT 3.4 release with early GLUT 4 routines.
|
||||
|
||||
GLUT_XLIB_IMPLEMENTATION=11 Mesa 2.5's GLUT 3.6 release.
|
||||
|
||||
GLUT_XLIB_IMPLEMENTATION=12 mjk's GLUT 3.6 release with early GLUT 4 routines + signal handling.
|
||||
**/
|
||||
#ifndef GLUT_XLIB_IMPLEMENTATION /* Allow this to be overriden. */
|
||||
#define GLUT_XLIB_IMPLEMENTATION 12
|
||||
#endif
|
||||
|
||||
/* Display mode bit masks. */
|
||||
#define GLUT_RGB 0
|
||||
#define GLUT_RGBA GLUT_RGB
|
||||
#define GLUT_INDEX 1
|
||||
#define GLUT_SINGLE 0
|
||||
#define GLUT_DOUBLE 2
|
||||
#define GLUT_ACCUM 4
|
||||
#define GLUT_ALPHA 8
|
||||
#define GLUT_DEPTH 16
|
||||
#define GLUT_STENCIL 32
|
||||
#if (GLUT_API_VERSION >= 2)
|
||||
#define GLUT_MULTISAMPLE 128
|
||||
#define GLUT_STEREO 256
|
||||
#endif
|
||||
#if (GLUT_API_VERSION >= 3)
|
||||
#define GLUT_LUMINANCE 512
|
||||
#endif
|
||||
|
||||
/* Mouse buttons. */
|
||||
#define GLUT_LEFT_BUTTON 0
|
||||
#define GLUT_MIDDLE_BUTTON 1
|
||||
#define GLUT_RIGHT_BUTTON 2
|
||||
|
||||
/* Mouse button state. */
|
||||
#define GLUT_DOWN 0
|
||||
#define GLUT_UP 1
|
||||
|
||||
#if (GLUT_API_VERSION >= 2)
|
||||
/* function keys */
|
||||
#define GLUT_KEY_F1 1
|
||||
#define GLUT_KEY_F2 2
|
||||
#define GLUT_KEY_F3 3
|
||||
#define GLUT_KEY_F4 4
|
||||
#define GLUT_KEY_F5 5
|
||||
#define GLUT_KEY_F6 6
|
||||
#define GLUT_KEY_F7 7
|
||||
#define GLUT_KEY_F8 8
|
||||
#define GLUT_KEY_F9 9
|
||||
#define GLUT_KEY_F10 10
|
||||
#define GLUT_KEY_F11 11
|
||||
#define GLUT_KEY_F12 12
|
||||
/* directional keys */
|
||||
#define GLUT_KEY_LEFT 100
|
||||
#define GLUT_KEY_UP 101
|
||||
#define GLUT_KEY_RIGHT 102
|
||||
#define GLUT_KEY_DOWN 103
|
||||
#define GLUT_KEY_PAGE_UP 104
|
||||
#define GLUT_KEY_PAGE_DOWN 105
|
||||
#define GLUT_KEY_HOME 106
|
||||
#define GLUT_KEY_END 107
|
||||
#define GLUT_KEY_INSERT 108
|
||||
#endif
|
||||
|
||||
/* Entry/exit state. */
|
||||
#define GLUT_LEFT 0
|
||||
#define GLUT_ENTERED 1
|
||||
|
||||
/* Menu usage state. */
|
||||
#define GLUT_MENU_NOT_IN_USE 0
|
||||
#define GLUT_MENU_IN_USE 1
|
||||
|
||||
/* Visibility state. */
|
||||
#define GLUT_NOT_VISIBLE 0
|
||||
#define GLUT_VISIBLE 1
|
||||
|
||||
/* Window status state. */
|
||||
#define GLUT_HIDDEN 0
|
||||
#define GLUT_FULLY_RETAINED 1
|
||||
#define GLUT_PARTIALLY_RETAINED 2
|
||||
#define GLUT_FULLY_COVERED 3
|
||||
|
||||
/* Color index component selection values. */
|
||||
#define GLUT_RED 0
|
||||
#define GLUT_GREEN 1
|
||||
#define GLUT_BLUE 2
|
||||
|
||||
/* Layers for use. */
|
||||
#define GLUT_NORMAL 0
|
||||
#define GLUT_OVERLAY 1
|
||||
|
||||
#if defined(WIN32)
|
||||
/* Stroke font constants (use these in GLUT program). */
|
||||
#define GLUT_STROKE_ROMAN ((void*)0)
|
||||
#define GLUT_STROKE_MONO_ROMAN ((void*)1)
|
||||
|
||||
/* Bitmap font constants (use these in GLUT program). */
|
||||
#define GLUT_BITMAP_9_BY_15 ((void*)2)
|
||||
#define GLUT_BITMAP_8_BY_13 ((void*)3)
|
||||
#define GLUT_BITMAP_TIMES_ROMAN_10 ((void*)4)
|
||||
#define GLUT_BITMAP_TIMES_ROMAN_24 ((void*)5)
|
||||
#if (GLUT_API_VERSION >= 3)
|
||||
#define GLUT_BITMAP_HELVETICA_10 ((void*)6)
|
||||
#define GLUT_BITMAP_HELVETICA_12 ((void*)7)
|
||||
#define GLUT_BITMAP_HELVETICA_18 ((void*)8)
|
||||
#endif
|
||||
#else
|
||||
/* Stroke font opaque addresses (use constants instead in source code). */
|
||||
extern void *glutStrokeRoman;
|
||||
extern void *glutStrokeMonoRoman;
|
||||
|
||||
/* Stroke font constants (use these in GLUT program). */
|
||||
#define GLUT_STROKE_ROMAN (&glutStrokeRoman)
|
||||
#define GLUT_STROKE_MONO_ROMAN (&glutStrokeMonoRoman)
|
||||
|
||||
/* Bitmap font opaque addresses (use constants instead in source code). */
|
||||
extern void *glutBitmap9By15;
|
||||
extern void *glutBitmap8By13;
|
||||
extern void *glutBitmapTimesRoman10;
|
||||
extern void *glutBitmapTimesRoman24;
|
||||
extern void *glutBitmapHelvetica10;
|
||||
extern void *glutBitmapHelvetica12;
|
||||
extern void *glutBitmapHelvetica18;
|
||||
|
||||
/* Bitmap font constants (use these in GLUT program). */
|
||||
#define GLUT_BITMAP_9_BY_15 (&glutBitmap9By15)
|
||||
#define GLUT_BITMAP_8_BY_13 (&glutBitmap8By13)
|
||||
#define GLUT_BITMAP_TIMES_ROMAN_10 (&glutBitmapTimesRoman10)
|
||||
#define GLUT_BITMAP_TIMES_ROMAN_24 (&glutBitmapTimesRoman24)
|
||||
#if (GLUT_API_VERSION >= 3)
|
||||
#define GLUT_BITMAP_HELVETICA_10 (&glutBitmapHelvetica10)
|
||||
#define GLUT_BITMAP_HELVETICA_12 (&glutBitmapHelvetica12)
|
||||
#define GLUT_BITMAP_HELVETICA_18 (&glutBitmapHelvetica18)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* glutGet parameters. */
|
||||
#define GLUT_WINDOW_X 100
|
||||
#define GLUT_WINDOW_Y 101
|
||||
#define GLUT_WINDOW_WIDTH 102
|
||||
#define GLUT_WINDOW_HEIGHT 103
|
||||
#define GLUT_WINDOW_BUFFER_SIZE 104
|
||||
#define GLUT_WINDOW_STENCIL_SIZE 105
|
||||
#define GLUT_WINDOW_DEPTH_SIZE 106
|
||||
#define GLUT_WINDOW_RED_SIZE 107
|
||||
#define GLUT_WINDOW_GREEN_SIZE 108
|
||||
#define GLUT_WINDOW_BLUE_SIZE 109
|
||||
#define GLUT_WINDOW_ALPHA_SIZE 110
|
||||
#define GLUT_WINDOW_ACCUM_RED_SIZE 111
|
||||
#define GLUT_WINDOW_ACCUM_GREEN_SIZE 112
|
||||
#define GLUT_WINDOW_ACCUM_BLUE_SIZE 113
|
||||
#define GLUT_WINDOW_ACCUM_ALPHA_SIZE 114
|
||||
#define GLUT_WINDOW_DOUBLEBUFFER 115
|
||||
#define GLUT_WINDOW_RGBA 116
|
||||
#define GLUT_WINDOW_PARENT 117
|
||||
#define GLUT_WINDOW_NUM_CHILDREN 118
|
||||
#define GLUT_WINDOW_COLORMAP_SIZE 119
|
||||
#if (GLUT_API_VERSION >= 2)
|
||||
#define GLUT_WINDOW_NUM_SAMPLES 120
|
||||
#define GLUT_WINDOW_STEREO 121
|
||||
#endif
|
||||
#if (GLUT_API_VERSION >= 3)
|
||||
#define GLUT_WINDOW_CURSOR 122
|
||||
#endif
|
||||
#define GLUT_SCREEN_WIDTH 200
|
||||
#define GLUT_SCREEN_HEIGHT 201
|
||||
#define GLUT_SCREEN_WIDTH_MM 202
|
||||
#define GLUT_SCREEN_HEIGHT_MM 203
|
||||
#define GLUT_MENU_NUM_ITEMS 300
|
||||
#define GLUT_DISPLAY_MODE_POSSIBLE 400
|
||||
#define GLUT_INIT_WINDOW_X 500
|
||||
#define GLUT_INIT_WINDOW_Y 501
|
||||
#define GLUT_INIT_WINDOW_WIDTH 502
|
||||
#define GLUT_INIT_WINDOW_HEIGHT 503
|
||||
#define GLUT_INIT_DISPLAY_MODE 504
|
||||
#if (GLUT_API_VERSION >= 2)
|
||||
#define GLUT_ELAPSED_TIME 700
|
||||
#endif
|
||||
|
||||
#if (GLUT_API_VERSION >= 2)
|
||||
/* glutDeviceGet parameters. */
|
||||
#define GLUT_HAS_KEYBOARD 600
|
||||
#define GLUT_HAS_MOUSE 601
|
||||
#define GLUT_HAS_SPACEBALL 602
|
||||
#define GLUT_HAS_DIAL_AND_BUTTON_BOX 603
|
||||
#define GLUT_HAS_TABLET 604
|
||||
#define GLUT_NUM_MOUSE_BUTTONS 605
|
||||
#define GLUT_NUM_SPACEBALL_BUTTONS 606
|
||||
#define GLUT_NUM_BUTTON_BOX_BUTTONS 607
|
||||
#define GLUT_NUM_DIALS 608
|
||||
#define GLUT_NUM_TABLET_BUTTONS 609
|
||||
#endif
|
||||
|
||||
#if (GLUT_API_VERSION >= 3)
|
||||
/* glutLayerGet parameters. */
|
||||
#define GLUT_OVERLAY_POSSIBLE 800
|
||||
#define GLUT_LAYER_IN_USE 801
|
||||
#define GLUT_HAS_OVERLAY 802
|
||||
#define GLUT_TRANSPARENT_INDEX 803
|
||||
#define GLUT_NORMAL_DAMAGED 804
|
||||
#define GLUT_OVERLAY_DAMAGED 805
|
||||
|
||||
#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9)
|
||||
/* glutVideoResizeGet parameters. */
|
||||
#define GLUT_VIDEO_RESIZE_POSSIBLE 900
|
||||
#define GLUT_VIDEO_RESIZE_IN_USE 901
|
||||
#define GLUT_VIDEO_RESIZE_X_DELTA 902
|
||||
#define GLUT_VIDEO_RESIZE_Y_DELTA 903
|
||||
#define GLUT_VIDEO_RESIZE_WIDTH_DELTA 904
|
||||
#define GLUT_VIDEO_RESIZE_HEIGHT_DELTA 905
|
||||
#define GLUT_VIDEO_RESIZE_X 906
|
||||
#define GLUT_VIDEO_RESIZE_Y 907
|
||||
#define GLUT_VIDEO_RESIZE_WIDTH 908
|
||||
#define GLUT_VIDEO_RESIZE_HEIGHT 909
|
||||
#endif
|
||||
|
||||
/* glutUseLayer parameters. */
|
||||
#define GLUT_NORMAL 0
|
||||
#define GLUT_OVERLAY 1
|
||||
|
||||
/* glutGetModifiers return mask. */
|
||||
#define GLUT_ACTIVE_SHIFT 1
|
||||
#define GLUT_ACTIVE_CTRL 2
|
||||
#define GLUT_ACTIVE_ALT 4
|
||||
|
||||
/* glutSetCursor parameters. */
|
||||
/* Basic arrows. */
|
||||
#define GLUT_CURSOR_RIGHT_ARROW 0
|
||||
#define GLUT_CURSOR_LEFT_ARROW 1
|
||||
/* Symbolic cursor shapes. */
|
||||
#define GLUT_CURSOR_INFO 2
|
||||
#define GLUT_CURSOR_DESTROY 3
|
||||
#define GLUT_CURSOR_HELP 4
|
||||
#define GLUT_CURSOR_CYCLE 5
|
||||
#define GLUT_CURSOR_SPRAY 6
|
||||
#define GLUT_CURSOR_WAIT 7
|
||||
#define GLUT_CURSOR_TEXT 8
|
||||
#define GLUT_CURSOR_CROSSHAIR 9
|
||||
/* Directional cursors. */
|
||||
#define GLUT_CURSOR_UP_DOWN 10
|
||||
#define GLUT_CURSOR_LEFT_RIGHT 11
|
||||
/* Sizing cursors. */
|
||||
#define GLUT_CURSOR_TOP_SIDE 12
|
||||
#define GLUT_CURSOR_BOTTOM_SIDE 13
|
||||
#define GLUT_CURSOR_LEFT_SIDE 14
|
||||
#define GLUT_CURSOR_RIGHT_SIDE 15
|
||||
#define GLUT_CURSOR_TOP_LEFT_CORNER 16
|
||||
#define GLUT_CURSOR_TOP_RIGHT_CORNER 17
|
||||
#define GLUT_CURSOR_BOTTOM_RIGHT_CORNER 18
|
||||
#define GLUT_CURSOR_BOTTOM_LEFT_CORNER 19
|
||||
/* Inherit from parent window. */
|
||||
#define GLUT_CURSOR_INHERIT 100
|
||||
/* Blank cursor. */
|
||||
#define GLUT_CURSOR_NONE 101
|
||||
/* Fullscreen crosshair (if available). */
|
||||
#define GLUT_CURSOR_FULL_CROSSHAIR 102
|
||||
#endif
|
||||
|
||||
/* GLUT initialization sub-API. */
|
||||
extern void APIENTRY glutInit(int *argcp, char **argv);
|
||||
extern void APIENTRY glutInitDisplayMode(unsigned int mode);
|
||||
#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9)
|
||||
extern void APIENTRY glutInitDisplayString(const char *string);
|
||||
#endif
|
||||
extern void APIENTRY glutInitWindowPosition(int x, int y);
|
||||
extern void APIENTRY glutInitWindowSize(int width, int height);
|
||||
extern void APIENTRY glutMainLoop(void);
|
||||
|
||||
/* GLUT window sub-API. */
|
||||
extern int APIENTRY glutCreateWindow(const char *title);
|
||||
extern int APIENTRY glutCreateSubWindow(int win, int x, int y, int width, int height);
|
||||
extern void APIENTRY glutDestroyWindow(int win);
|
||||
extern void APIENTRY glutPostRedisplay(void);
|
||||
#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 11)
|
||||
extern void APIENTRY glutPostWindowRedisplay(int win);
|
||||
#endif
|
||||
extern void APIENTRY glutSwapBuffers(void);
|
||||
extern int APIENTRY glutGetWindow(void);
|
||||
extern void APIENTRY glutSetWindow(int win);
|
||||
extern void APIENTRY glutSetWindowTitle(const char *title);
|
||||
extern void APIENTRY glutSetIconTitle(const char *title);
|
||||
extern void APIENTRY glutPositionWindow(int x, int y);
|
||||
extern void APIENTRY glutReshapeWindow(int width, int height);
|
||||
extern void APIENTRY glutPopWindow(void);
|
||||
extern void APIENTRY glutPushWindow(void);
|
||||
extern void APIENTRY glutIconifyWindow(void);
|
||||
extern void APIENTRY glutShowWindow(void);
|
||||
extern void APIENTRY glutHideWindow(void);
|
||||
#if (GLUT_API_VERSION >= 3)
|
||||
extern void APIENTRY glutFullScreen(void);
|
||||
extern void APIENTRY glutSetCursor(int cursor);
|
||||
#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9)
|
||||
extern void APIENTRY glutWarpPointer(int x, int y);
|
||||
#endif
|
||||
|
||||
/* GLUT overlay sub-API. */
|
||||
extern void APIENTRY glutEstablishOverlay(void);
|
||||
extern void APIENTRY glutRemoveOverlay(void);
|
||||
extern void APIENTRY glutUseLayer(GLenum layer);
|
||||
extern void APIENTRY glutPostOverlayRedisplay(void);
|
||||
#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 11)
|
||||
extern void APIENTRY glutPostWindowOverlayRedisplay(int win);
|
||||
#endif
|
||||
extern void APIENTRY glutShowOverlay(void);
|
||||
extern void APIENTRY glutHideOverlay(void);
|
||||
#endif
|
||||
|
||||
/* GLUT menu sub-API. */
|
||||
extern int APIENTRY glutCreateMenu(void (*)(int));
|
||||
extern void APIENTRY glutDestroyMenu(int menu);
|
||||
extern int APIENTRY glutGetMenu(void);
|
||||
extern void APIENTRY glutSetMenu(int menu);
|
||||
extern void APIENTRY glutAddMenuEntry(const char *label, int value);
|
||||
extern void APIENTRY glutAddSubMenu(const char *label, int submenu);
|
||||
extern void APIENTRY glutChangeToMenuEntry(int item, const char *label, int value);
|
||||
extern void APIENTRY glutChangeToSubMenu(int item, const char *label, int submenu);
|
||||
extern void APIENTRY glutRemoveMenuItem(int item);
|
||||
extern void APIENTRY glutAttachMenu(int button);
|
||||
extern void APIENTRY glutDetachMenu(int button);
|
||||
|
||||
/* GLUT sub-API. */
|
||||
extern void APIENTRY glutDisplayFunc(void (*)(void));
|
||||
extern void APIENTRY glutReshapeFunc(void (*)(int width, int height));
|
||||
extern void APIENTRY glutKeyboardFunc(void (*)(unsigned char key, int x, int y));
|
||||
extern void APIENTRY glutMouseFunc(void (*)(int button, int state, int x, int y));
|
||||
extern void APIENTRY glutMotionFunc(void (*)(int x, int y));
|
||||
extern void APIENTRY glutPassiveMotionFunc(void (*)(int x, int y));
|
||||
extern void APIENTRY glutEntryFunc(void (*)(int state));
|
||||
extern void APIENTRY glutVisibilityFunc(void (*)(int state));
|
||||
extern void APIENTRY glutIdleFunc(void (*)(void));
|
||||
extern void APIENTRY glutTimerFunc(unsigned int millis, void (*)(int value), int value);
|
||||
extern void APIENTRY glutMenuStateFunc(void (*)(int state));
|
||||
#if (GLUT_API_VERSION >= 2)
|
||||
extern void APIENTRY glutSpecialFunc(void (*)(int key, int x, int y));
|
||||
extern void APIENTRY glutSpaceballMotionFunc(void (*)(int x, int y, int z));
|
||||
extern void APIENTRY glutSpaceballRotateFunc(void (*)(int x, int y, int z));
|
||||
extern void APIENTRY glutSpaceballButtonFunc(void (*)(int button, int state));
|
||||
extern void APIENTRY glutButtonBoxFunc(void (*)(int button, int state));
|
||||
extern void APIENTRY glutDialsFunc(void (*)(int dial, int value));
|
||||
extern void APIENTRY glutTabletMotionFunc(void (*)(int x, int y));
|
||||
extern void APIENTRY glutTabletButtonFunc(void (*)(int button, int state, int x, int y));
|
||||
#if (GLUT_API_VERSION >= 3)
|
||||
extern void APIENTRY glutMenuStatusFunc(void (*)(int status, int x, int y));
|
||||
extern void APIENTRY glutOverlayDisplayFunc(void (*)(void));
|
||||
#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9)
|
||||
extern void APIENTRY glutWindowStatusFunc(void (*)(int state));
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* GLUT color index sub-API. */
|
||||
extern void APIENTRY glutSetColor(int, GLfloat red, GLfloat green, GLfloat blue);
|
||||
extern GLfloat APIENTRY glutGetColor(int ndx, int component);
|
||||
extern void APIENTRY glutCopyColormap(int win);
|
||||
|
||||
/* GLUT state retrieval sub-API. */
|
||||
extern int APIENTRY glutGet(GLenum type);
|
||||
extern int APIENTRY glutDeviceGet(GLenum type);
|
||||
#if (GLUT_API_VERSION >= 2)
|
||||
/* GLUT extension support sub-API */
|
||||
extern int APIENTRY glutExtensionSupported(const char *name);
|
||||
#endif
|
||||
#if (GLUT_API_VERSION >= 3)
|
||||
extern int APIENTRY glutGetModifiers(void);
|
||||
extern int APIENTRY glutLayerGet(GLenum type);
|
||||
#endif
|
||||
|
||||
/* GLUT font sub-API */
|
||||
extern void APIENTRY glutBitmapCharacter(void *font, int character);
|
||||
extern int APIENTRY glutBitmapWidth(void *font, int character);
|
||||
extern void APIENTRY glutStrokeCharacter(void *font, int character);
|
||||
extern int APIENTRY glutStrokeWidth(void *font, int character);
|
||||
#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9)
|
||||
extern int APIENTRY glutBitmapLength(void *font, const unsigned char *string);
|
||||
extern int APIENTRY glutStrokeLength(void *font, const unsigned char *string);
|
||||
#endif
|
||||
|
||||
/* GLUT pre-built models sub-API */
|
||||
extern void APIENTRY glutWireSphere(GLdouble radius, GLint slices, GLint stacks);
|
||||
extern void APIENTRY glutSolidSphere(GLdouble radius, GLint slices, GLint stacks);
|
||||
extern void APIENTRY glutWireCone(GLdouble base, GLdouble height, GLint slices, GLint stacks);
|
||||
extern void APIENTRY glutSolidCone(GLdouble base, GLdouble height, GLint slices, GLint stacks);
|
||||
extern void APIENTRY glutWireCube(GLdouble size);
|
||||
extern void APIENTRY glutSolidCube(GLdouble size);
|
||||
extern void APIENTRY glutWireTorus(GLdouble innerRadius, GLdouble outerRadius, GLint sides, GLint rings);
|
||||
extern void APIENTRY glutSolidTorus(GLdouble innerRadius, GLdouble outerRadius, GLint sides, GLint rings);
|
||||
extern void APIENTRY glutWireDodecahedron(void);
|
||||
extern void APIENTRY glutSolidDodecahedron(void);
|
||||
extern void APIENTRY glutWireTeapot(GLdouble size);
|
||||
extern void APIENTRY glutSolidTeapot(GLdouble size);
|
||||
extern void APIENTRY glutWireOctahedron(void);
|
||||
extern void APIENTRY glutSolidOctahedron(void);
|
||||
extern void APIENTRY glutWireTetrahedron(void);
|
||||
extern void APIENTRY glutSolidTetrahedron(void);
|
||||
extern void APIENTRY glutWireIcosahedron(void);
|
||||
extern void APIENTRY glutSolidIcosahedron(void);
|
||||
|
||||
#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9)
|
||||
/* GLUT video resize sub-API. */
|
||||
extern int APIENTRY glutVideoResizeGet(GLenum param);
|
||||
extern void APIENTRY glutSetupVideoResizing(void);
|
||||
extern void APIENTRY glutStopVideoResizing(void);
|
||||
extern void APIENTRY glutVideoResize(int x, int y, int width, int height);
|
||||
extern void APIENTRY glutVideoPan(int x, int y, int width, int height);
|
||||
|
||||
/* GLUT debugging sub-API. */
|
||||
extern void APIENTRY glutReportErrors(void);
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
#endif
|
||||
#endif /* __glut_h__ */
|
||||
@ -0,0 +1,107 @@
|
||||
/*
|
||||
* _mingw.h
|
||||
*
|
||||
* Mingw specific macros included by ALL include files.
|
||||
*
|
||||
* This file is part of the Mingw32 package.
|
||||
*
|
||||
* Contributors:
|
||||
* Created by Mumit Khan <khan@xraylith.wisc.edu>
|
||||
*
|
||||
* THIS SOFTWARE IS NOT COPYRIGHTED
|
||||
*
|
||||
* This source code is offered for use in the public domain. You may
|
||||
* use, modify or distribute it freely.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful but
|
||||
* WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
|
||||
* DISCLAIMED. This includes but is not limited to warranties of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __MINGW_H
|
||||
#define __MINGW_H
|
||||
|
||||
/* These are defined by the user (or the compiler)
|
||||
to specify how identifiers are imported from a DLL.
|
||||
|
||||
__DECLSPEC_SUPPORTED Defined if dllimport attribute is supported.
|
||||
__MINGW_IMPORT The attribute definition to specify imported
|
||||
variables/functions.
|
||||
_CRTIMP As above. For MS compatibility.
|
||||
__MINGW32_VERSION Runtime version.
|
||||
__MINGW32_MAJOR_VERSION Runtime major version.
|
||||
__MINGW32_MINOR_VERSION Runtime minor version.
|
||||
__MINGW32_BUILD_DATE Runtime build date.
|
||||
|
||||
Other macros:
|
||||
|
||||
__int64 define to be long long. Using a typedef can
|
||||
tweak bugs in the C++ parser.
|
||||
|
||||
All headers should include this first, and then use __DECLSPEC_SUPPORTED
|
||||
to choose between the old ``__imp__name'' style or __MINGW_IMPORT
|
||||
style declarations. */
|
||||
|
||||
#ifndef __GNUC__
|
||||
# ifndef __MINGW_IMPORT
|
||||
# define __MINGW_IMPORT __declspec(dllimport)
|
||||
# endif
|
||||
# ifndef _CRTIMP
|
||||
# define _CRTIMP __declspec(dllimport)
|
||||
# endif
|
||||
# define __DECLSPEC_SUPPORTED
|
||||
#else /* __GNUC__ */
|
||||
# ifdef __declspec
|
||||
# ifndef __MINGW_IMPORT
|
||||
/* Note the extern. This is needed to work around GCC's
|
||||
limitations in handling dllimport attribute. */
|
||||
# define __MINGW_IMPORT extern __attribute__((dllimport))
|
||||
# endif
|
||||
# ifndef _CRTIMP
|
||||
# ifdef __USE_CRTIMP
|
||||
# define _CRTIMP __attribute__((dllimport))
|
||||
# else
|
||||
# define _CRTIMP
|
||||
# endif
|
||||
# endif
|
||||
# define __DECLSPEC_SUPPORTED
|
||||
# else /* __declspec */
|
||||
# undef __DECLSPEC_SUPPORTED
|
||||
# undef __MINGW_IMPORT
|
||||
# ifndef _CRTIMP
|
||||
# define _CRTIMP
|
||||
# endif
|
||||
# endif /* __declspec */
|
||||
# ifndef __cdecl
|
||||
# define __cdecl __attribute__((cdecl))
|
||||
# endif
|
||||
# ifndef __stdcall
|
||||
# define __stdcall __attribute__((stdcall))
|
||||
# endif
|
||||
# ifndef __int64
|
||||
# define __int64 long long
|
||||
# endif
|
||||
# ifndef __int32
|
||||
# define __int32 long
|
||||
# endif
|
||||
# ifndef __int16
|
||||
# define __int16 int
|
||||
# endif
|
||||
# ifndef __int8
|
||||
# define __int8 char
|
||||
# endif
|
||||
# ifndef __small
|
||||
# define __small char
|
||||
# endif
|
||||
# ifndef __hyper
|
||||
# define __hyper long long
|
||||
# endif
|
||||
#endif /* __GNUC__ */
|
||||
|
||||
#define __MINGW32_VERSION 3.1
|
||||
#define __MINGW32_MAJOR_VERSION 3
|
||||
#define __MINGW32_MINOR_VERSION 1
|
||||
|
||||
#endif /* __MINGW_H */
|
||||
@ -0,0 +1,315 @@
|
||||
#ifndef _ACCCTRL_H
|
||||
#define _ACCCTRL_H
|
||||
#if __GNUC__ >=3
|
||||
#pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define AccFree LocalFree
|
||||
#define ACTRL_RESERVED 0x00000000
|
||||
#define ACTRL_ACCESS_PROTECTED 0x00000001
|
||||
#define ACTRL_ACCESS_ALLOWED 0x00000001
|
||||
#define ACTRL_ACCESS_DENIED 0x00000002
|
||||
#define ACTRL_AUDIT_SUCCESS 0x00000004
|
||||
#define ACTRL_AUDIT_FAILURE 0x00000008
|
||||
#define ACTRL_SYSTEM_ACCESS 0x04000000
|
||||
#define ACTRL_DELETE 0x08000000
|
||||
#define ACTRL_READ_CONTROL 0x10000000
|
||||
#define ACTRL_CHANGE_ACCESS 0x20000000
|
||||
#define ACTRL_CHANGE_OWNER 0x40000000
|
||||
#define ACTRL_SYNCHRONIZE 0x80000000
|
||||
#define ACTRL_STD_RIGHTS_ALL 0xf8000000
|
||||
|
||||
#define ACTRL_FILE_READ 0x00000001
|
||||
#define ACTRL_FILE_WRITE 0x00000002
|
||||
#define ACTRL_FILE_APPEND 0x00000004
|
||||
#define ACTRL_FILE_READ_PROP 0x00000008
|
||||
#define ACTRL_FILE_WRITE_PROP 0x00000010
|
||||
#define ACTRL_FILE_EXECUTE 0x00000020
|
||||
#define ACTRL_FILE_READ_ATTRIB 0x00000080
|
||||
#define ACTRL_FILE_WRITE_ATTRIB 0x00000100
|
||||
#define ACTRL_FILE_CREATE_PIPE 0x00000200
|
||||
#define ACTRL_DIR_LIST 0x00000001
|
||||
#define ACTRL_DIR_CREATE_OBJECT 0x00000002
|
||||
#define ACTRL_DIR_CREATE_CHILD 0x00000004
|
||||
#define ACTRL_DIR_DELETE_CHILD 0x00000040
|
||||
#define ACTRL_DIR_TRAVERSE 0x00000020
|
||||
#define ACTRL_KERNEL_TERMINATE 0x00000001
|
||||
#define ACTRL_KERNEL_THREAD 0x00000002
|
||||
#define ACTRL_KERNEL_VM 0x00000004
|
||||
#define ACTRL_KERNEL_VM_READ 0x00000008
|
||||
#define ACTRL_KERNEL_VM_WRITE 0x00000010
|
||||
#define ACTRL_KERNEL_DUP_HANDLE 0x00000020
|
||||
#define ACTRL_KERNEL_PROCESS 0x00000040
|
||||
#define ACTRL_KERNEL_SET_INFO 0x00000080
|
||||
#define ACTRL_KERNEL_GET_INFO 0x00000100
|
||||
#define ACTRL_KERNEL_CONTROL 0x00000200
|
||||
#define ACTRL_KERNEL_ALERT 0x00000400
|
||||
#define ACTRL_KERNEL_GET_CONTEXT 0x00000800
|
||||
#define ACTRL_KERNEL_SET_CONTEXT 0x00001000
|
||||
#define ACTRL_KERNEL_TOKEN 0x00002000
|
||||
#define ACTRL_KERNEL_IMPERSONATE 0x00004000
|
||||
#define ACTRL_KERNEL_DIMPERSONATE 0x00008000
|
||||
#define ACTRL_PRINT_SADMIN 0x00000001
|
||||
#define ACTRL_PRINT_SLIST 0x00000002
|
||||
#define ACTRL_PRINT_PADMIN 0x00000004
|
||||
#define ACTRL_PRINT_PUSE 0x00000008
|
||||
#define ACTRL_PRINT_JADMIN 0x00000010
|
||||
#define ACTRL_SVC_GET_INFO 0x00000001
|
||||
#define ACTRL_SVC_SET_INFO 0x00000002
|
||||
#define ACTRL_SVC_STATUS 0x00000004
|
||||
#define ACTRL_SVC_LIST 0x00000008
|
||||
#define ACTRL_SVC_START 0x00000010
|
||||
#define ACTRL_SVC_STOP 0x00000020
|
||||
#define ACTRL_SVC_PAUSE 0x00000040
|
||||
#define ACTRL_SVC_INTERROGATE 0x00000080
|
||||
#define ACTRL_SVC_UCONTROL 0x00000100
|
||||
#define ACTRL_REG_QUERY 0x00000001
|
||||
#define ACTRL_REG_SET 0x00000002
|
||||
#define ACTRL_REG_CREATE_CHILD 0x00000004
|
||||
#define ACTRL_REG_LIST 0x00000008
|
||||
#define ACTRL_REG_NOTIFY 0x00000010
|
||||
#define ACTRL_REG_LINK 0x00000020
|
||||
#define ACTRL_WIN_CLIPBRD 0x00000001
|
||||
#define ACTRL_WIN_GLOBAL_ATOMS 0x00000002
|
||||
#define ACTRL_WIN_CREATE 0x00000004
|
||||
#define ACTRL_WIN_LIST_DESK 0x00000008
|
||||
#define ACTRL_WIN_LIST 0x00000010
|
||||
#define ACTRL_WIN_READ_ATTRIBS 0x00000020
|
||||
#define ACTRL_WIN_WRITE_ATTRIBS 0x00000040
|
||||
#define ACTRL_WIN_SCREEN 0x00000080
|
||||
#define ACTRL_WIN_EXIT 0x00000100
|
||||
#define ACTRL_ACCESS_NO_OPTIONS 0x00000000
|
||||
#define ACTRL_ACCESS_SUPPORTS_OBJECT_ENTRIES 0x00000001
|
||||
#define ACCCTRL_DEFAULT_PROVIDERA "Windows NT Access Provider"
|
||||
#define ACCCTRL_DEFAULT_PROVIDERW L"Windows NT Access Provider"
|
||||
#define TRUSTEE_ACCESS_ALLOWED 0x00000001L
|
||||
#define TRUSTEE_ACCESS_READ 0x00000002L
|
||||
#define TRUSTEE_ACCESS_WRITE 0x00000004L
|
||||
#define TRUSTEE_ACCESS_EXPLICIT 0x00000001L
|
||||
#define TRUSTEE_ACCESS_READ_WRITE (TRUSTEE_ACCESS_READ | TRUSTEE_ACCESS_WRITE)
|
||||
#define TRUSTEE_ACCESS_ALL 0xFFFFFFFFL
|
||||
#define NO_INHERITANCE 0x0
|
||||
#define SUB_OBJECTS_ONLY_INHERIT 0x1
|
||||
#define SUB_CONTAINERS_ONLY_INHERIT 0x2
|
||||
#define SUB_CONTAINERS_AND_OBJECTS_INHERIT 0x3
|
||||
#define INHERIT_NO_PROPAGATE 0x4
|
||||
#define INHERIT_ONLY 0x8
|
||||
#define INHERITED_ACCESS_ENTRY 0x10
|
||||
#define INHERITED_PARENT 0x10000000
|
||||
#define INHERITED_GRANDPARENT 0x20000000
|
||||
|
||||
typedef ULONG INHERIT_FLAGS, *PINHERIT_FLAGS;
|
||||
typedef ULONG ACCESS_RIGHTS, *PACCESS_RIGHTS;
|
||||
|
||||
typedef enum _ACCESS_MODE {
|
||||
NOT_USED_ACCESS = 0,
|
||||
GRANT_ACCESS,
|
||||
SET_ACCESS,
|
||||
DENY_ACCESS,
|
||||
REVOKE_ACCESS,
|
||||
SET_AUDIT_SUCCESS,
|
||||
SET_AUDIT_FAILURE
|
||||
} ACCESS_MODE;
|
||||
typedef enum _SE_OBJECT_TYPE {
|
||||
SE_UNKNOWN_OBJECT_TYPE = 0,
|
||||
SE_FILE_OBJECT,
|
||||
SE_SERVICE,
|
||||
SE_PRINTER,
|
||||
SE_REGISTRY_KEY,
|
||||
SE_LMSHARE,
|
||||
SE_KERNEL_OBJECT,
|
||||
SE_WINDOW_OBJECT,
|
||||
SE_DS_OBJECT,
|
||||
SE_DS_OBJECT_ALL,
|
||||
SE_PROVIDER_DEFINED_OBJECT,
|
||||
SE_WMIGUID_OBJECT,
|
||||
SE_REGISTRY_WOW64_32KEY
|
||||
} SE_OBJECT_TYPE;
|
||||
typedef enum _TRUSTEE_TYPE {
|
||||
TRUSTEE_IS_UNKNOWN,
|
||||
TRUSTEE_IS_USER,
|
||||
TRUSTEE_IS_GROUP,
|
||||
TRUSTEE_IS_DOMAIN,
|
||||
TRUSTEE_IS_ALIAS,
|
||||
TRUSTEE_IS_WELL_KNOWN_GROUP,
|
||||
TRUSTEE_IS_DELETED,
|
||||
TRUSTEE_IS_INVALID,
|
||||
TRUSTEE_IS_COMPUTER
|
||||
} TRUSTEE_TYPE;
|
||||
typedef enum _TRUSTEE_FORM {
|
||||
TRUSTEE_IS_SID,
|
||||
TRUSTEE_IS_NAME,
|
||||
TRUSTEE_BAD_FORM,
|
||||
TRUSTEE_IS_OBJECTS_AND_SID,
|
||||
TRUSTEE_IS_OBJECTS_AND_NAME
|
||||
} TRUSTEE_FORM;
|
||||
typedef enum _MULTIPLE_TRUSTEE_OPERATION {
|
||||
NO_MULTIPLE_TRUSTEE,
|
||||
TRUSTEE_IS_IMPERSONATE
|
||||
} MULTIPLE_TRUSTEE_OPERATION;
|
||||
typedef struct _TRUSTEE_A {
|
||||
struct _TRUSTEE_A *pMultipleTrustee;
|
||||
MULTIPLE_TRUSTEE_OPERATION MultipleTrusteeOperation;
|
||||
TRUSTEE_FORM TrusteeForm;
|
||||
TRUSTEE_TYPE TrusteeType;
|
||||
LPSTR ptstrName;
|
||||
} TRUSTEE_A, *PTRUSTEE_A, TRUSTEEA, *PTRUSTEEA;
|
||||
typedef struct _TRUSTEE_W {
|
||||
struct _TRUSTEE_W *pMultipleTrustee;
|
||||
MULTIPLE_TRUSTEE_OPERATION MultipleTrusteeOperation;
|
||||
TRUSTEE_FORM TrusteeForm;
|
||||
TRUSTEE_TYPE TrusteeType;
|
||||
LPWSTR ptstrName;
|
||||
} TRUSTEE_W, *PTRUSTEE_W, TRUSTEEW, *PTRUSTEEW;
|
||||
typedef struct _ACTRL_ACCESS_ENTRYA {
|
||||
TRUSTEE_A Trustee;
|
||||
ULONG fAccessFlags;
|
||||
ACCESS_RIGHTS Access;
|
||||
ACCESS_RIGHTS ProvSpecificAccess;
|
||||
INHERIT_FLAGS Inheritance;
|
||||
LPCSTR lpInheritProperty;
|
||||
} ACTRL_ACCESS_ENTRYA, *PACTRL_ACCESS_ENTRYA;
|
||||
typedef struct _ACTRL_ACCESS_ENTRYW {
|
||||
TRUSTEE_W Trustee;
|
||||
ULONG fAccessFlags;
|
||||
ACCESS_RIGHTS Access;
|
||||
ACCESS_RIGHTS ProvSpecificAccess;
|
||||
INHERIT_FLAGS Inheritance;
|
||||
LPCWSTR lpInheritProperty;
|
||||
} ACTRL_ACCESS_ENTRYW, *PACTRL_ACCESS_ENTRYW;
|
||||
typedef struct _ACTRL_ACCESS_ENTRY_LISTA {
|
||||
ULONG cEntries;
|
||||
ACTRL_ACCESS_ENTRYA *pAccessList;
|
||||
} ACTRL_ACCESS_ENTRY_LISTA, *PACTRL_ACCESS_ENTRY_LISTA;
|
||||
typedef struct _ACTRL_ACCESS_ENTRY_LISTW {
|
||||
ULONG cEntries;
|
||||
ACTRL_ACCESS_ENTRYW *pAccessList;
|
||||
} ACTRL_ACCESS_ENTRY_LISTW, *PACTRL_ACCESS_ENTRY_LISTW;
|
||||
typedef struct _ACTRL_PROPERTY_ENTRYA {
|
||||
LPCSTR lpProperty;
|
||||
PACTRL_ACCESS_ENTRY_LISTA pAccessEntryList;
|
||||
ULONG fListFlags;
|
||||
} ACTRL_PROPERTY_ENTRYA, *PACTRL_PROPERTY_ENTRYA;
|
||||
typedef struct _ACTRL_PROPERTY_ENTRYW {
|
||||
LPCWSTR lpProperty;
|
||||
PACTRL_ACCESS_ENTRY_LISTW pAccessEntryList;
|
||||
ULONG fListFlags;
|
||||
} ACTRL_PROPERTY_ENTRYW, *PACTRL_PROPERTY_ENTRYW;
|
||||
typedef struct _ACTRL_ALISTA {
|
||||
ULONG cEntries;
|
||||
PACTRL_PROPERTY_ENTRYA pPropertyAccessList;
|
||||
} ACTRL_ACCESSA, *PACTRL_ACCESSA, ACTRL_AUDITA, *PACTRL_AUDITA;
|
||||
typedef struct _ACTRL_ALISTW {
|
||||
ULONG cEntries;
|
||||
PACTRL_PROPERTY_ENTRYW pPropertyAccessList;
|
||||
} ACTRL_ACCESSW, *PACTRL_ACCESSW, ACTRL_AUDITW, *PACTRL_AUDITW;
|
||||
typedef struct _TRUSTEE_ACCESSA {
|
||||
LPSTR lpProperty;
|
||||
ACCESS_RIGHTS Access;
|
||||
ULONG fAccessFlags;
|
||||
ULONG fReturnedAccess;
|
||||
} TRUSTEE_ACCESSA, *PTRUSTEE_ACCESSA;
|
||||
typedef struct _TRUSTEE_ACCESSW {
|
||||
LPWSTR lpProperty;
|
||||
ACCESS_RIGHTS Access;
|
||||
ULONG fAccessFlags;
|
||||
ULONG fReturnedAccess;
|
||||
} TRUSTEE_ACCESSW, *PTRUSTEE_ACCESSW;
|
||||
typedef struct _ACTRL_OVERLAPPED {
|
||||
_ANONYMOUS_UNION
|
||||
union {
|
||||
PVOID Provider;
|
||||
ULONG Reserved1;
|
||||
} DUMMYUNIONNAME;
|
||||
ULONG Reserved2;
|
||||
HANDLE hEvent;
|
||||
} ACTRL_OVERLAPPED, *PACTRL_OVERLAPPED;
|
||||
typedef struct _ACTRL_ACCESS_INFOA {
|
||||
ULONG fAccessPermission;
|
||||
LPSTR lpAccessPermissionName;
|
||||
} ACTRL_ACCESS_INFOA, *PACTRL_ACCESS_INFOA;
|
||||
typedef struct _ACTRL_ACCESS_INFOW {
|
||||
ULONG fAccessPermission;
|
||||
LPWSTR lpAccessPermissionName;
|
||||
} ACTRL_ACCESS_INFOW, *PACTRL_ACCESS_INFOW;
|
||||
typedef struct _ACTRL_CONTROL_INFOA {
|
||||
LPSTR lpControlId;
|
||||
LPSTR lpControlName;
|
||||
} ACTRL_CONTROL_INFOA, *PACTRL_CONTROL_INFOA;
|
||||
typedef struct _ACTRL_CONTROL_INFOW {
|
||||
LPWSTR lpControlId;
|
||||
LPWSTR lpControlName;
|
||||
} ACTRL_CONTROL_INFOW, *PACTRL_CONTROL_INFOW;
|
||||
typedef struct _EXPLICIT_ACCESS_A {
|
||||
DWORD grfAccessPermissions;
|
||||
ACCESS_MODE grfAccessMode;
|
||||
DWORD grfInheritance;
|
||||
TRUSTEE_A Trustee;
|
||||
} EXPLICIT_ACCESS_A, *PEXPLICIT_ACCESS_A, EXPLICIT_ACCESSA, *PEXPLICIT_ACCESSA;
|
||||
typedef struct _EXPLICIT_ACCESS_W {
|
||||
DWORD grfAccessPermissions;
|
||||
ACCESS_MODE grfAccessMode;
|
||||
DWORD grfInheritance;
|
||||
TRUSTEE_W Trustee;
|
||||
} EXPLICIT_ACCESS_W, *PEXPLICIT_ACCESS_W, EXPLICIT_ACCESSW, *PEXPLICIT_ACCESSW;
|
||||
typedef struct _OBJECTS_AND_SID {
|
||||
DWORD ObjectsPresent;
|
||||
GUID ObjectTypeGuid;
|
||||
GUID InheritedObjectTypeGuid;
|
||||
SID * pSid;
|
||||
} OBJECTS_AND_SID, *POBJECTS_AND_SID;
|
||||
typedef struct _OBJECTS_AND_NAME_A {
|
||||
DWORD ObjectsPresent;
|
||||
SE_OBJECT_TYPE ObjectType;
|
||||
LPSTR ObjectTypeName;
|
||||
LPSTR InheritedObjectTypeName;
|
||||
LPSTR ptstrName;
|
||||
} OBJECTS_AND_NAME_A, *POBJECTS_AND_NAME_A;
|
||||
typedef struct _OBJECTS_AND_NAME_W {
|
||||
DWORD ObjectsPresent;
|
||||
SE_OBJECT_TYPE ObjectType;
|
||||
LPWSTR ObjectTypeName;
|
||||
LPWSTR InheritedObjectTypeName;
|
||||
LPWSTR ptstrName;
|
||||
} OBJECTS_AND_NAME_W, *POBJECTS_AND_NAME_W;
|
||||
|
||||
|
||||
#ifdef UNICODE
|
||||
#define ACCCTRL_DEFAULT_PROVIDER ACCCTRL_DEFAULT_PROVIDERW
|
||||
typedef TRUSTEE_W TRUSTEE_, *PTRUSTEE_;
|
||||
typedef TRUSTEEW TRUSTEE, *PTRUSTEE;
|
||||
typedef ACTRL_ACCESSW ACTRL_ACCESS, *PACTRL_ACCESS;
|
||||
typedef ACTRL_ACCESS_ENTRY_LISTW ACTRL_ACCESS_ENTRY_LIST, *PACTRL_ACCESS_ENTRY_LIST;
|
||||
typedef ACTRL_ACCESS_INFOW ACTRL_ACCESS_INFO, *PACTRL_ACCESS_INFO;
|
||||
typedef ACTRL_ACCESS_ENTRYW ACTRL_ACCESS_ENTRY, *PACTRL_ACCESS_ENTRY;
|
||||
typedef ACTRL_AUDITW ACTRL_AUDIT, *PACTRL_AUDIT;
|
||||
typedef ACTRL_CONTROL_INFOW ACTRL_CONTROL_INFO, *PACTRL_CONTROL_INFO;
|
||||
typedef EXPLICIT_ACCESS_W EXPLICIT_ACCESS_, *PEXPLICIT_ACCESS_;
|
||||
typedef EXPLICIT_ACCESSW EXPLICIT_ACCESS, *PEXPLICIT_ACCESS;
|
||||
typedef TRUSTEE_ACCESSW TRUSTEE_ACCESS, *PTRUSTEE_ACCESS;
|
||||
typedef OBJECTS_AND_NAME_W OBJECTS_AND_NAME_, *POBJECTS_AND_NAME_;
|
||||
#else
|
||||
#define ACCCTRL_DEFAULT_PROVIDER ACCCTRL_DEFAULT_PROVIDERA
|
||||
typedef TRUSTEE_A TRUSTEE_, *PTRUSTEE_;
|
||||
typedef TRUSTEEA TRUSTEE, *PTRUSTEE;
|
||||
typedef ACTRL_ACCESSA ACTRL_ACCESS, *PACTRL_ACCESS;
|
||||
typedef ACTRL_ACCESS_ENTRY_LISTA ACTRL_ACCESS_ENTRY_LIST, *PACTRL_ACCESS_ENTRY_LIST;
|
||||
typedef ACTRL_ACCESS_INFOA ACTRL_ACCESS_INFO, *PACTRL_ACCESS_INFO;
|
||||
typedef ACTRL_ACCESS_ENTRYA ACTRL_ACCESS_ENTRY, *PACTRL_ACCESS_ENTRY;
|
||||
typedef ACTRL_AUDITA ACTRL_AUDIT, *PACTRL_AUDIT;
|
||||
typedef ACTRL_CONTROL_INFOA ACTRL_CONTROL_INFO, *PACTRL_CONTROL_INFO;
|
||||
typedef EXPLICIT_ACCESS_A EXPLICIT_ACCESS_, *PEXPLICIT_ACCESS_;
|
||||
typedef EXPLICIT_ACCESSA EXPLICIT_ACCESS, *PEXPLICIT_ACCESS;
|
||||
typedef TRUSTEE_ACCESSA TRUSTEE_ACCESS, *PTRUSTEE_ACCESS;
|
||||
typedef OBJECTS_AND_NAME_A OBJECTS_AND_NAME_, *POBJECTS_AND_NAME_;
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _ACCCTRL_H */
|
||||
@ -0,0 +1,113 @@
|
||||
#ifndef _ACLAPI_H
|
||||
#define _ACLAPI_H
|
||||
#if __GNUC__ >= 3
|
||||
#pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#include <windows.h>
|
||||
#include <accctrl.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
VOID WINAPI BuildExplicitAccessWithNameA(PEXPLICIT_ACCESS_A,LPSTR,DWORD,ACCESS_MODE,DWORD);
|
||||
VOID WINAPI BuildExplicitAccessWithNameW(PEXPLICIT_ACCESS_W,LPWSTR,DWORD,ACCESS_MODE,DWORD);
|
||||
DWORD WINAPI BuildSecurityDescriptorA(PTRUSTEE_A,PTRUSTEE_A ,ULONG,PEXPLICIT_ACCESS_A,
|
||||
ULONG,PEXPLICIT_ACCESS_A,PSECURITY_DESCRIPTOR,PULONG,PSECURITY_DESCRIPTOR*);
|
||||
DWORD WINAPI BuildSecurityDescriptorW(PTRUSTEE_W,PTRUSTEE_W ,ULONG,PEXPLICIT_ACCESS_W,
|
||||
ULONG,PEXPLICIT_ACCESS_W,PSECURITY_DESCRIPTOR,PULONG,PSECURITY_DESCRIPTOR*);
|
||||
VOID WINAPI BuildTrusteeWithNameA(PTRUSTEE_A,LPSTR);
|
||||
VOID WINAPI BuildTrusteeWithNameW(PTRUSTEE_W,LPWSTR);
|
||||
VOID WINAPI BuildTrusteeWithObjectsAndNameA(PTRUSTEE_A,POBJECTS_AND_NAME_A,SE_OBJECT_TYPE,
|
||||
LPSTR,LPSTR,LPSTR);
|
||||
VOID WINAPI BuildTrusteeWithObjectsAndNameW(PTRUSTEE_W,POBJECTS_AND_NAME_W,SE_OBJECT_TYPE,
|
||||
LPWSTR,LPWSTR,LPWSTR);
|
||||
VOID WINAPI BuildTrusteeWithObjectsAndSidA(PTRUSTEE_A,POBJECTS_AND_SID,GUID*,GUID*,PSID);
|
||||
VOID WINAPI BuildTrusteeWithObjectsAndSidW(PTRUSTEE_W,POBJECTS_AND_SID,GUID*,GUID*,PSID);
|
||||
VOID WINAPI BuildTrusteeWithSidA(PTRUSTEE_A,PSID);
|
||||
VOID WINAPI BuildTrusteeWithSidW(PTRUSTEE_W,PSID);
|
||||
DWORD WINAPI GetAuditedPermissionsFromAclA(PACL,PTRUSTEE_A,PACCESS_MASK,PACCESS_MASK);
|
||||
DWORD WINAPI GetAuditedPermissionsFromAclW(PACL,PTRUSTEE_W,PACCESS_MASK,PACCESS_MASK);
|
||||
DWORD WINAPI GetEffectiveRightsFromAclA(PACL,PTRUSTEE_A,PACCESS_MASK);
|
||||
DWORD WINAPI GetEffectiveRightsFromAclW(PACL,PTRUSTEE_W,PACCESS_MASK);
|
||||
DWORD WINAPI GetExplicitEntriesFromAclA(PACL,PULONG,PEXPLICIT_ACCESS_A*);
|
||||
DWORD WINAPI GetExplicitEntriesFromAclW(PACL,PULONG,PEXPLICIT_ACCESS_W*);
|
||||
DWORD WINAPI GetNamedSecurityInfoA(LPSTR,SE_OBJECT_TYPE,SECURITY_INFORMATION,
|
||||
PSID*,PSID*,PACL*,PACL*,PSECURITY_DESCRIPTOR*);
|
||||
DWORD WINAPI GetNamedSecurityInfoW(LPWSTR,SE_OBJECT_TYPE,SECURITY_INFORMATION,
|
||||
PSID*,PSID*,PACL*,PACL*,PSECURITY_DESCRIPTOR*);
|
||||
DWORD WINAPI GetSecurityInfo(HANDLE,SE_OBJECT_TYPE,SECURITY_INFORMATION,
|
||||
PSID*,PSID*,PACL*,PACL*,PSECURITY_DESCRIPTOR*);
|
||||
TRUSTEE_FORM WINAPI GetTrusteeFormA(PTRUSTEE_A);
|
||||
TRUSTEE_FORM WINAPI GetTrusteeFormW(PTRUSTEE_W);
|
||||
LPSTR WINAPI GetTrusteeNameA(PTRUSTEE_A);
|
||||
LPWSTR WINAPI GetTrusteeNameW(PTRUSTEE_W);
|
||||
TRUSTEE_TYPE WINAPI GetTrusteeTypeA(PTRUSTEE_A);
|
||||
TRUSTEE_TYPE WINAPI GetTrusteeTypeW(PTRUSTEE_W);
|
||||
DWORD WINAPI LookupSecurityDescriptorPartsA(PTRUSTEE_A*,PTRUSTEE_A*,PULONG,PEXPLICIT_ACCESS_A*,
|
||||
PULONG,PEXPLICIT_ACCESS_A*,PSECURITY_DESCRIPTOR);
|
||||
DWORD WINAPI LookupSecurityDescriptorPartsW(PTRUSTEE_W*,PTRUSTEE_W*,PULONG,PEXPLICIT_ACCESS_W*,
|
||||
PULONG,PEXPLICIT_ACCESS_W*,PSECURITY_DESCRIPTOR);
|
||||
DWORD WINAPI SetEntriesInAclA(ULONG,PEXPLICIT_ACCESS_A,PACL,PACL*);
|
||||
DWORD WINAPI SetEntriesInAclW(ULONG,PEXPLICIT_ACCESS_W,PACL,PACL*);
|
||||
DWORD WINAPI SetNamedSecurityInfoA(LPSTR,SE_OBJECT_TYPE,SECURITY_INFORMATION,PSID,PSID,PACL,PACL);
|
||||
DWORD WINAPI SetNamedSecurityInfoW(LPWSTR,SE_OBJECT_TYPE,SECURITY_INFORMATION,PSID,PSID,PACL,PACL);
|
||||
DWORD WINAPI SetSecurityInfo(HANDLE,SE_OBJECT_TYPE,SECURITY_INFORMATION,PSID,PSID,PACL,PACL);
|
||||
VOID WINAPI BuildImpersonateExplicitAccessWithNameA(PEXPLICIT_ACCESS_A,LPSTR,PTRUSTEE_A,DWORD,ACCESS_MODE,DWORD);
|
||||
VOID WINAPI BuildImpersonateExplicitAccessWithNameW(PEXPLICIT_ACCESS_W,LPWSTR,PTRUSTEE_W,DWORD,ACCESS_MODE,DWORD);
|
||||
VOID WINAPI BuildImpersonateTrusteeA(PTRUSTEE_A,PTRUSTEE_A);
|
||||
VOID WINAPI BuildImpersonateTrusteeW(PTRUSTEE_W,PTRUSTEE_W);
|
||||
PTRUSTEE_A WINAPI GetMultipleTrusteeA(PTRUSTEE_A);
|
||||
PTRUSTEE_W WINAPI GetMultipleTrusteeW(PTRUSTEE_W);
|
||||
MULTIPLE_TRUSTEE_OPERATION WINAPI GetMultipleTrusteeOperationA(PTRUSTEE_A);
|
||||
MULTIPLE_TRUSTEE_OPERATION WINAPI GetMultipleTrusteeOperationW(PTRUSTEE_W);
|
||||
|
||||
#ifdef UNICODE
|
||||
#define BuildExplicitAccessWithName BuildExplicitAccessWithNameW
|
||||
#define BuildSecurityDescriptor BuildSecurityDescriptorW
|
||||
#define BuildTrusteeWithName BuildTrusteeWithNameW
|
||||
#define BuildTrusteeWithObjectsAndName BuildTrusteeWithObjectsAndNameW
|
||||
#define BuildTrusteeWithObjectsAndSid BuildTrusteeWithObjectsAndSidW
|
||||
#define BuildTrusteeWithSid BuildTrusteeWithSidW
|
||||
#define GetAuditedPermissionsFromAcl GetAuditedPermissionsFromAclW
|
||||
#define GetEffectiveRightsFromAcl GetEffectiveRightsFromAclW
|
||||
#define GetExplicitEntriesFromAcl GetExplicitEntriesFromAclW
|
||||
#define GetNamedSecurityInfo GetNamedSecurityInfoW
|
||||
#define GetTrusteeForm GetTrusteeFormW
|
||||
#define GetTrusteeName GetTrusteeNameW
|
||||
#define GetTrusteeType GetTrusteeTypeW
|
||||
#define LookupSecurityDescriptorParts LookupSecurityDescriptorPartsW
|
||||
#define SetEntriesInAcl SetEntriesInAclW
|
||||
#define SetNamedSecurityInfo SetNamedSecurityInfoW
|
||||
#define BuildImpersonateExplicitAccessWithName BuildImpersonateExplicitAccessWithNameW
|
||||
#define BuildImpersonateTrustee BuildImpersonateTrusteeW
|
||||
#define GetMultipleTrustee GetMultipleTrusteeW
|
||||
#define GetMultipleTrusteeOperation GetMultipleTrusteeOperationW
|
||||
#else
|
||||
#define BuildExplicitAccessWithName BuildExplicitAccessWithNameA
|
||||
#define BuildSecurityDescriptor BuildSecurityDescriptorA
|
||||
#define BuildTrusteeWithName BuildTrusteeWithNameA
|
||||
#define BuildTrusteeWithObjectsAndName BuildTrusteeWithObjectsAndNameA
|
||||
#define BuildTrusteeWithObjectsAndSid BuildTrusteeWithObjectsAndSidA
|
||||
#define BuildTrusteeWithSid BuildTrusteeWithSidA
|
||||
#define GetAuditedPermissionsFromAcl GetAuditedPermissionsFromAclA
|
||||
#define GetEffectiveRightsFromAcl GetEffectiveRightsFromAclA
|
||||
#define GetExplicitEntriesFromAcl GetExplicitEntriesFromAclA
|
||||
#define GetNamedSecurityInfo GetNamedSecurityInfoA
|
||||
#define GetTrusteeForm GetTrusteeFormA
|
||||
#define GetTrusteeName GetTrusteeNameA
|
||||
#define GetTrusteeType GetTrusteeTypeA
|
||||
#define LookupSecurityDescriptorParts LookupSecurityDescriptorPartsA
|
||||
#define SetEntriesInAcl SetEntriesInAclA
|
||||
#define SetNamedSecurityInfo SetNamedSecurityInfoA
|
||||
#define BuildImpersonateExplicitAccessWithName BuildImpersonateExplicitAccessWithNameA
|
||||
#define BuildImpersonateTrustee BuildImpersonateTrusteeA
|
||||
#define GetMultipleTrustee GetMultipleTrusteeA
|
||||
#define GetMultipleTrusteeOperation GetMultipleTrusteeOperationA
|
||||
#endif /* UNICODE */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@ -0,0 +1,298 @@
|
||||
/* ANSI and traditional C compatability macros
|
||||
Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001
|
||||
Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
|
||||
/* ANSI and traditional C compatibility macros
|
||||
|
||||
ANSI C is assumed if __STDC__ is #defined.
|
||||
|
||||
Macro ANSI C definition Traditional C definition
|
||||
----- ---- - ---------- ----------- - ----------
|
||||
ANSI_PROTOTYPES 1 not defined
|
||||
PTR `void *' `char *'
|
||||
PTRCONST `void *const' `char *'
|
||||
LONG_DOUBLE `long double' `double'
|
||||
const not defined `'
|
||||
volatile not defined `'
|
||||
signed not defined `'
|
||||
VA_START(ap, var) va_start(ap, var) va_start(ap)
|
||||
|
||||
Note that it is safe to write "void foo();" indicating a function
|
||||
with no return value, in all K+R compilers we have been able to test.
|
||||
|
||||
For declaring functions with prototypes, we also provide these:
|
||||
|
||||
PARAMS ((prototype))
|
||||
-- for functions which take a fixed number of arguments. Use this
|
||||
when declaring the function. When defining the function, write a
|
||||
K+R style argument list. For example:
|
||||
|
||||
char *strcpy PARAMS ((char *dest, char *source));
|
||||
...
|
||||
char *
|
||||
strcpy (dest, source)
|
||||
char *dest;
|
||||
char *source;
|
||||
{ ... }
|
||||
|
||||
|
||||
VPARAMS ((prototype, ...))
|
||||
-- for functions which take a variable number of arguments. Use
|
||||
PARAMS to declare the function, VPARAMS to define it. For example:
|
||||
|
||||
int printf PARAMS ((const char *format, ...));
|
||||
...
|
||||
int
|
||||
printf VPARAMS ((const char *format, ...))
|
||||
{
|
||||
...
|
||||
}
|
||||
|
||||
For writing functions which take variable numbers of arguments, we
|
||||
also provide the VA_OPEN, VA_CLOSE, and VA_FIXEDARG macros. These
|
||||
hide the differences between K+R <varargs.h> and C89 <stdarg.h> more
|
||||
thoroughly than the simple VA_START() macro mentioned above.
|
||||
|
||||
VA_OPEN and VA_CLOSE are used *instead of* va_start and va_end.
|
||||
Immediately after VA_OPEN, put a sequence of VA_FIXEDARG calls
|
||||
corresponding to the list of fixed arguments. Then use va_arg
|
||||
normally to get the variable arguments, or pass your va_list object
|
||||
around. You do not declare the va_list yourself; VA_OPEN does it
|
||||
for you.
|
||||
|
||||
Here is a complete example:
|
||||
|
||||
int
|
||||
printf VPARAMS ((const char *format, ...))
|
||||
{
|
||||
int result;
|
||||
|
||||
VA_OPEN (ap, format);
|
||||
VA_FIXEDARG (ap, const char *, format);
|
||||
|
||||
result = vfprintf (stdout, format, ap);
|
||||
VA_CLOSE (ap);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
You can declare variables either before or after the VA_OPEN,
|
||||
VA_FIXEDARG sequence. Also, VA_OPEN and VA_CLOSE are the beginning
|
||||
and end of a block. They must appear at the same nesting level,
|
||||
and any variables declared after VA_OPEN go out of scope at
|
||||
VA_CLOSE. Unfortunately, with a K+R compiler, that includes the
|
||||
argument list. You can have multiple instances of VA_OPEN/VA_CLOSE
|
||||
pairs in a single function in case you need to traverse the
|
||||
argument list more than once.
|
||||
|
||||
For ease of writing code which uses GCC extensions but needs to be
|
||||
portable to other compilers, we provide the GCC_VERSION macro that
|
||||
simplifies testing __GNUC__ and __GNUC_MINOR__ together, and various
|
||||
wrappers around __attribute__. Also, __extension__ will be #defined
|
||||
to nothing if it doesn't work. See below.
|
||||
|
||||
This header also defines a lot of obsolete macros:
|
||||
CONST, VOLATILE, SIGNED, PROTO, EXFUN, DEFUN, DEFUN_VOID,
|
||||
AND, DOTS, NOARGS. Don't use them. */
|
||||
|
||||
#ifndef _ANSIDECL_H
|
||||
#define _ANSIDECL_H 1
|
||||
|
||||
/* Every source file includes this file,
|
||||
so they will all get the switch for lint. */
|
||||
/* LINTLIBRARY */
|
||||
|
||||
/* Using MACRO(x,y) in cpp #if conditionals does not work with some
|
||||
older preprocessors. Thus we can't define something like this:
|
||||
|
||||
#define HAVE_GCC_VERSION(MAJOR, MINOR) \
|
||||
(__GNUC__ > (MAJOR) || (__GNUC__ == (MAJOR) && __GNUC_MINOR__ >= (MINOR)))
|
||||
|
||||
and then test "#if HAVE_GCC_VERSION(2,7)".
|
||||
|
||||
So instead we use the macro below and test it against specific values. */
|
||||
|
||||
/* This macro simplifies testing whether we are using gcc, and if it
|
||||
is of a particular minimum version. (Both major & minor numbers are
|
||||
significant.) This macro will evaluate to 0 if we are not using
|
||||
gcc at all. */
|
||||
#ifndef GCC_VERSION
|
||||
#define GCC_VERSION (__GNUC__ * 1000 + __GNUC_MINOR__)
|
||||
#endif /* GCC_VERSION */
|
||||
|
||||
#if defined (__STDC__) || defined (_AIX) || (defined (__mips) && defined (_SYSTYPE_SVR4)) || defined(_WIN32) || (defined(__alpha) && defined(__cplusplus))
|
||||
/* All known AIX compilers implement these things (but don't always
|
||||
define __STDC__). The RISC/OS MIPS compiler defines these things
|
||||
in SVR4 mode, but does not define __STDC__. */
|
||||
/* eraxxon@alumni.rice.edu: The Compaq C++ compiler, unlike many other
|
||||
C++ compilers, does not define __STDC__, though it acts as if this
|
||||
was so. (Verified versions: 5.7, 6.2, 6.3, 6.5) */
|
||||
|
||||
#define ANSI_PROTOTYPES 1
|
||||
#define PTR void *
|
||||
#define PTRCONST void *const
|
||||
#define LONG_DOUBLE long double
|
||||
|
||||
#define PARAMS(ARGS) ARGS
|
||||
#define VPARAMS(ARGS) ARGS
|
||||
#define VA_START(VA_LIST, VAR) va_start(VA_LIST, VAR)
|
||||
|
||||
/* variadic function helper macros */
|
||||
/* "struct Qdmy" swallows the semicolon after VA_OPEN/VA_FIXEDARG's
|
||||
use without inhibiting further decls and without declaring an
|
||||
actual variable. */
|
||||
#define VA_OPEN(AP, VAR) { va_list AP; va_start(AP, VAR); { struct Qdmy
|
||||
#define VA_CLOSE(AP) } va_end(AP); }
|
||||
#define VA_FIXEDARG(AP, T, N) struct Qdmy
|
||||
|
||||
#undef const
|
||||
#undef volatile
|
||||
#undef signed
|
||||
|
||||
/* inline requires special treatment; it's in C99, and GCC >=2.7 supports
|
||||
it too, but it's not in C89. */
|
||||
#undef inline
|
||||
#if __STDC_VERSION__ > 199901L
|
||||
/* it's a keyword */
|
||||
#else
|
||||
# if GCC_VERSION >= 2007
|
||||
# define inline __inline__ /* __inline__ prevents -pedantic warnings */
|
||||
# else
|
||||
# define inline /* nothing */
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* These are obsolete. Do not use. */
|
||||
#ifndef IN_GCC
|
||||
#define CONST const
|
||||
#define VOLATILE volatile
|
||||
#define SIGNED signed
|
||||
|
||||
#define PROTO(type, name, arglist) type name arglist
|
||||
#define EXFUN(name, proto) name proto
|
||||
#define DEFUN(name, arglist, args) name(args)
|
||||
#define DEFUN_VOID(name) name(void)
|
||||
#define AND ,
|
||||
#define DOTS , ...
|
||||
#define NOARGS void
|
||||
#endif /* ! IN_GCC */
|
||||
|
||||
#else /* Not ANSI C. */
|
||||
|
||||
#undef ANSI_PROTOTYPES
|
||||
#define PTR char *
|
||||
#define PTRCONST PTR
|
||||
#define LONG_DOUBLE double
|
||||
|
||||
#define PARAMS(args) ()
|
||||
#define VPARAMS(args) (va_alist) va_dcl
|
||||
#define VA_START(va_list, var) va_start(va_list)
|
||||
|
||||
#define VA_OPEN(AP, VAR) { va_list AP; va_start(AP); { struct Qdmy
|
||||
#define VA_CLOSE(AP) } va_end(AP); }
|
||||
#define VA_FIXEDARG(AP, TYPE, NAME) TYPE NAME = va_arg(AP, TYPE)
|
||||
|
||||
/* some systems define these in header files for non-ansi mode */
|
||||
#undef const
|
||||
#undef volatile
|
||||
#undef signed
|
||||
#undef inline
|
||||
#define const
|
||||
#define volatile
|
||||
#define signed
|
||||
#define inline
|
||||
|
||||
#ifndef IN_GCC
|
||||
#define CONST
|
||||
#define VOLATILE
|
||||
#define SIGNED
|
||||
|
||||
#define PROTO(type, name, arglist) type name ()
|
||||
#define EXFUN(name, proto) name()
|
||||
#define DEFUN(name, arglist, args) name arglist args;
|
||||
#define DEFUN_VOID(name) name()
|
||||
#define AND ;
|
||||
#define DOTS
|
||||
#define NOARGS
|
||||
#endif /* ! IN_GCC */
|
||||
|
||||
#endif /* ANSI C. */
|
||||
|
||||
/* Define macros for some gcc attributes. This permits us to use the
|
||||
macros freely, and know that they will come into play for the
|
||||
version of gcc in which they are supported. */
|
||||
|
||||
#if (GCC_VERSION < 2007)
|
||||
# define __attribute__(x)
|
||||
#endif
|
||||
|
||||
/* Attribute __malloc__ on functions was valid as of gcc 2.96. */
|
||||
#ifndef ATTRIBUTE_MALLOC
|
||||
# if (GCC_VERSION >= 2096)
|
||||
# define ATTRIBUTE_MALLOC __attribute__ ((__malloc__))
|
||||
# else
|
||||
# define ATTRIBUTE_MALLOC
|
||||
# endif /* GNUC >= 2.96 */
|
||||
#endif /* ATTRIBUTE_MALLOC */
|
||||
|
||||
/* Attributes on labels were valid as of gcc 2.93. */
|
||||
#ifndef ATTRIBUTE_UNUSED_LABEL
|
||||
# if (GCC_VERSION >= 2093)
|
||||
# define ATTRIBUTE_UNUSED_LABEL ATTRIBUTE_UNUSED
|
||||
# else
|
||||
# define ATTRIBUTE_UNUSED_LABEL
|
||||
# endif /* GNUC >= 2.93 */
|
||||
#endif /* ATTRIBUTE_UNUSED_LABEL */
|
||||
|
||||
#ifndef ATTRIBUTE_UNUSED
|
||||
#define ATTRIBUTE_UNUSED __attribute__ ((__unused__))
|
||||
#endif /* ATTRIBUTE_UNUSED */
|
||||
|
||||
#ifndef ATTRIBUTE_NORETURN
|
||||
#define ATTRIBUTE_NORETURN __attribute__ ((__noreturn__))
|
||||
#endif /* ATTRIBUTE_NORETURN */
|
||||
|
||||
#ifndef ATTRIBUTE_PRINTF
|
||||
#define ATTRIBUTE_PRINTF(m, n) __attribute__ ((__format__ (__printf__, m, n)))
|
||||
#define ATTRIBUTE_PRINTF_1 ATTRIBUTE_PRINTF(1, 2)
|
||||
#define ATTRIBUTE_PRINTF_2 ATTRIBUTE_PRINTF(2, 3)
|
||||
#define ATTRIBUTE_PRINTF_3 ATTRIBUTE_PRINTF(3, 4)
|
||||
#define ATTRIBUTE_PRINTF_4 ATTRIBUTE_PRINTF(4, 5)
|
||||
#define ATTRIBUTE_PRINTF_5 ATTRIBUTE_PRINTF(5, 6)
|
||||
#endif /* ATTRIBUTE_PRINTF */
|
||||
|
||||
/* We use __extension__ in some places to suppress -pedantic warnings
|
||||
about GCC extensions. This feature didn't work properly before
|
||||
gcc 2.8. */
|
||||
#if GCC_VERSION < 2008
|
||||
#define __extension__
|
||||
#endif
|
||||
|
||||
/* Bootstrap support: Adjust certain macros defined by Autoconf,
|
||||
which are only valid for the stage1 compiler. If we detect
|
||||
a modern version of GCC, we are probably in stage2 or beyond,
|
||||
so unconditionally reset the values. Note that const, inline,
|
||||
etc. have been dealt with above. */
|
||||
#if (GCC_VERSION >= 2007)
|
||||
# ifndef HAVE_LONG_DOUBLE
|
||||
# define HAVE_LONG_DOUBLE 1
|
||||
# endif
|
||||
#endif /* GCC >= 2.7 */
|
||||
|
||||
#endif /* ansidecl.h */
|
||||
@ -0,0 +1,71 @@
|
||||
/*
|
||||
* assert.h
|
||||
*
|
||||
* Define the assert macro for debug output.
|
||||
*
|
||||
* This file is part of the Mingw32 package.
|
||||
*
|
||||
* Contributors:
|
||||
* Created by Colin Peters <colin@bird.fu.is.saga-u.ac.jp>
|
||||
*
|
||||
* THIS SOFTWARE IS NOT COPYRIGHTED
|
||||
*
|
||||
* This source code is offered for use in the public domain. You may
|
||||
* use, modify or distribute it freely.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful but
|
||||
* WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
|
||||
* DISCLAIMED. This includes but is not limited to warranties of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
* $Revision: 1.4 $
|
||||
* $Author: earnie $
|
||||
* $Date: 2003/02/21 21:19:51 $
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _ASSERT_H_
|
||||
#define _ASSERT_H_
|
||||
|
||||
/* All the headers include this file. */
|
||||
#include <_mingw.h>
|
||||
|
||||
#ifndef RC_INVOKED
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#ifdef NDEBUG
|
||||
|
||||
/*
|
||||
* If not debugging, assert does nothing.
|
||||
*/
|
||||
#define assert(x) ((void)0)
|
||||
|
||||
#else /* debugging enabled */
|
||||
|
||||
/*
|
||||
* CRTDLL nicely supplies a function which does the actual output and
|
||||
* call to abort.
|
||||
*/
|
||||
_CRTIMP void __cdecl _assert (const char*, const char*, int)
|
||||
#ifdef __GNUC__
|
||||
__attribute__ ((noreturn))
|
||||
#endif
|
||||
;
|
||||
|
||||
/*
|
||||
* Definition of the assert macro.
|
||||
*/
|
||||
#define assert(e) ((e) ? (void)0 : _assert(#e, __FILE__, __LINE__))
|
||||
#endif /* NDEBUG */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* Not RC_INVOKED */
|
||||
|
||||
#endif /* Not _ASSERT_H_ */
|
||||
|
||||
@ -0,0 +1,119 @@
|
||||
#ifndef _BASETSD_H
|
||||
#define _BASETSD_H
|
||||
#if __GNUC__ >=3
|
||||
#pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#ifdef __GNUC__
|
||||
#ifndef __int64
|
||||
#define __int64 long long
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(_WIN64)
|
||||
#define __int3264 __int64
|
||||
#define ADDRESS_TAG_BIT 0x40000000000UI64
|
||||
#else /* !_WIN64 */
|
||||
#define __int3264 __int32
|
||||
#define ADDRESS_TAG_BIT 0x80000000UL
|
||||
#define HandleToUlong( h ) ((ULONG)(ULONG_PTR)(h) )
|
||||
#define HandleToLong( h ) ((LONG)(LONG_PTR) (h) )
|
||||
#define LongToHandle( h) ((HANDLE)(LONG_PTR) (h))
|
||||
#define PtrToUlong( p ) ((ULONG)(ULONG_PTR) (p) )
|
||||
#define PtrToLong( p ) ((LONG)(LONG_PTR) (p) )
|
||||
#define PtrToUint( p ) ((UINT)(UINT_PTR) (p) )
|
||||
#define PtrToInt( p ) ((INT)(INT_PTR) (p) )
|
||||
#define PtrToUshort( p ) ((unsigned short)(ULONG_PTR)(p) )
|
||||
#define PtrToShort( p ) ((short)(LONG_PTR)(p) )
|
||||
#define IntToPtr( i ) ((VOID*)(INT_PTR)((int)i))
|
||||
#define UIntToPtr( ui ) ((VOID*)(UINT_PTR)((unsigned int)ui))
|
||||
#define LongToPtr( l ) ((VOID*)(LONG_PTR)((long)l))
|
||||
#define ULongToPtr( ul ) ((VOID*)(ULONG_PTR)((unsigned long)ul))
|
||||
#endif /* !_WIN64 */
|
||||
|
||||
#define UlongToPtr(ul) ULongToPtr(ul)
|
||||
#define UintToPtr(ui) UIntToPtr(ui)
|
||||
#define MAXUINT_PTR (~((UINT_PTR)0))
|
||||
#define MAXINT_PTR ((INT_PTR)(MAXUINT_PTR >> 1))
|
||||
#define MININT_PTR (~MAXINT_PTR)
|
||||
#define MAXULONG_PTR (~((ULONG_PTR)0))
|
||||
#define MAXLONG_PTR ((LONG_PTR)(MAXULONG_PTR >> 1))
|
||||
#define MINLONG_PTR (~MAXLONG_PTR)
|
||||
#define MAXUHALF_PTR ((UHALF_PTR)~0)
|
||||
#define MAXHALF_PTR ((HALF_PTR)(MAXUHALF_PTR >> 1))
|
||||
#define MINHALF_PTR (~MAXHALF_PTR)
|
||||
|
||||
#ifndef RC_INVOKED
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
typedef int LONG32, *PLONG32;
|
||||
#ifndef XFree86Server
|
||||
typedef int INT32, *PINT32;
|
||||
#endif /* ndef XFree86Server */
|
||||
typedef unsigned int ULONG32, *PULONG32;
|
||||
typedef unsigned int DWORD32, *PDWORD32;
|
||||
typedef unsigned int UINT32, *PUINT32;
|
||||
|
||||
#if defined(_WIN64)
|
||||
typedef __int64 INT_PTR, *PINT_PTR;
|
||||
typedef unsigned __int64 UINT_PTR, *PUINT_PTR;
|
||||
typedef __int64 LONG_PTR, *PLONG_PTR;
|
||||
typedef unsigned __int64 ULONG_PTR, *PULONG_PTR;
|
||||
typedef unsigned __int64 HANDLE_PTR;
|
||||
typedef unsigned int UHALF_PTR, *PUHALF_PTR;
|
||||
typedef int HALF_PTR, *PHALF_PTR;
|
||||
|
||||
#if 0 /* TODO when WIN64 is here */
|
||||
inline unsigned long HandleToUlong(const void* h )
|
||||
{ return((unsigned long) h ); }
|
||||
inline long HandleToLong( const void* h )
|
||||
{ return((long) h ); }
|
||||
inline void* LongToHandle( const long h )
|
||||
{ return((void*) (INT_PTR) h ); }
|
||||
inline unsigned long PtrToUlong( const void* p)
|
||||
{ return((unsigned long) p ); }
|
||||
inline unsigned int PtrToUint( const void* p )
|
||||
{ return((unsigned int) p ); }
|
||||
inline unsigned short PtrToUshort( const void* p )
|
||||
{ return((unsigned short) p ); }
|
||||
inline long PtrToLong( const void* p )
|
||||
{ return((long) p ); }
|
||||
inline int PtrToInt( const void* p )
|
||||
{ return((int) p ); }
|
||||
inline short PtrToShort( const void* p )
|
||||
{ return((short) p ); }
|
||||
inline void* IntToPtr( const int i )
|
||||
{ return( (void*)(INT_PTR)i ); }
|
||||
inline void* UIntToPtr(const unsigned int ui)
|
||||
{ return( (void*)(UINT_PTR)ui ); }
|
||||
inline void* LongToPtr( const long l )
|
||||
{ return( (void*)(LONG_PTR)l ); }
|
||||
inline void* ULongToPtr( const unsigned long ul )
|
||||
{ return( (void*)(ULONG_PTR)ul ); }
|
||||
#endif /* 0_ */
|
||||
|
||||
#else /* !_WIN64 */
|
||||
typedef int INT_PTR, *PINT_PTR;
|
||||
typedef unsigned int UINT_PTR, *PUINT_PTR;
|
||||
typedef long LONG_PTR, *PLONG_PTR;
|
||||
typedef unsigned long ULONG_PTR, *PULONG_PTR;
|
||||
typedef unsigned short UHALF_PTR, *PUHALF_PTR;
|
||||
typedef short HALF_PTR, *PHALF_PTR;
|
||||
typedef unsigned long HANDLE_PTR;
|
||||
#endif /* !_WIN64 */
|
||||
|
||||
typedef ULONG_PTR SIZE_T, *PSIZE_T;
|
||||
typedef LONG_PTR SSIZE_T, *PSSIZE_T;
|
||||
typedef ULONG_PTR DWORD_PTR, *PDWORD_PTR;
|
||||
typedef __int64 LONG64, *PLONG64;
|
||||
typedef __int64 INT64, *PINT64;
|
||||
typedef unsigned __int64 ULONG64, *PULONG64;
|
||||
typedef unsigned __int64 DWORD64, *PDWORD64;
|
||||
typedef unsigned __int64 UINT64, *PUINT64;
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif /* !RC_INVOKED */
|
||||
|
||||
#endif /* _BASETSD_H */
|
||||
@ -0,0 +1,166 @@
|
||||
#ifndef _BASETYPS_H
|
||||
#define _BASETYPS_H
|
||||
#if __GNUC__ >=3
|
||||
#pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#ifndef __OBJC__
|
||||
# ifdef __cplusplus
|
||||
# define EXTERN_C extern "C"
|
||||
# else
|
||||
# define EXTERN_C extern
|
||||
# endif /* __cplusplus */
|
||||
# ifndef __int64
|
||||
# define __int64 long long
|
||||
# endif
|
||||
# ifndef __int32
|
||||
# define __int32 long
|
||||
# endif
|
||||
# ifndef __int16
|
||||
# define __int16 int
|
||||
# endif
|
||||
# ifndef __int8
|
||||
# define __int8 char
|
||||
# endif
|
||||
# ifndef __small
|
||||
# define __small char
|
||||
# endif
|
||||
# ifndef __hyper
|
||||
# define __hyper long long
|
||||
# endif
|
||||
# define STDMETHODCALLTYPE __stdcall
|
||||
# define STDMETHODVCALLTYPE __cdecl
|
||||
# define STDAPICALLTYPE __stdcall
|
||||
# define STDAPIVCALLTYPE __cdecl
|
||||
# define STDAPI EXTERN_C HRESULT STDAPICALLTYPE
|
||||
# define STDAPI_(t) EXTERN_C t STDAPICALLTYPE
|
||||
# define STDMETHODIMP HRESULT STDMETHODCALLTYPE
|
||||
# define STDMETHODIMP_(t) t STDMETHODCALLTYPE
|
||||
# define STDAPIV EXTERN_C HRESULT STDAPIVCALLTYPE
|
||||
# define STDAPIV_(t) EXTERN_C t STDAPIVCALLTYPE
|
||||
# define STDMETHODIMPV HRESULT STDMETHODVCALLTYPE
|
||||
# define STDMETHODIMPV_(t) t STDMETHODVCALLTYPE
|
||||
# define interface struct
|
||||
# if defined(__cplusplus) && !defined(CINTERFACE)
|
||||
# define STDMETHOD(m) virtual HRESULT STDMETHODCALLTYPE m
|
||||
# define STDMETHOD_(t,m) virtual t STDMETHODCALLTYPE m
|
||||
# define PURE =0
|
||||
# define THIS_
|
||||
# define THIS void
|
||||
/*
|
||||
__attribute__((com_interface)) is obsolete in __GNUC__ >= 3
|
||||
g++ vtables are now COM-compatible by default
|
||||
*/
|
||||
# if defined(__GNUC__) && __GNUC__ < 3 && !defined(NOCOMATTRIBUTE)
|
||||
# define DECLARE_INTERFACE(i) interface __attribute__((com_interface)) i
|
||||
# define DECLARE_INTERFACE_(i,b) interface __attribute__((com_interface)) i : public b
|
||||
# else
|
||||
# define DECLARE_INTERFACE(i) interface i
|
||||
# define DECLARE_INTERFACE_(i,b) interface i : public b
|
||||
# endif
|
||||
# else
|
||||
# define STDMETHOD(m) HRESULT(STDMETHODCALLTYPE *m)
|
||||
# define STDMETHOD_(t,m) t(STDMETHODCALLTYPE *m)
|
||||
# define PURE
|
||||
# define THIS_ INTERFACE *,
|
||||
# define THIS INTERFACE *
|
||||
# ifndef CONST_VTABLE
|
||||
# define CONST_VTABLE
|
||||
# endif
|
||||
# define DECLARE_INTERFACE(i) \
|
||||
typedef interface i { CONST_VTABLE struct i##Vtbl *lpVtbl; } i; \
|
||||
typedef CONST_VTABLE struct i##Vtbl i##Vtbl; \
|
||||
CONST_VTABLE struct i##Vtbl
|
||||
# define DECLARE_INTERFACE_(i,b) DECLARE_INTERFACE(i)
|
||||
# endif
|
||||
# define BEGIN_INTERFACE
|
||||
# define END_INTERFACE
|
||||
|
||||
# define FWD_DECL(i) typedef interface i i
|
||||
# if defined(__cplusplus) && !defined(CINTERFACE)
|
||||
# define IENUM_THIS(T)
|
||||
# define IENUM_THIS_(T)
|
||||
# else
|
||||
# define IENUM_THIS(T) T*
|
||||
# define IENUM_THIS_(T) T*,
|
||||
# endif
|
||||
# define DECLARE_ENUMERATOR_(I,T) \
|
||||
DECLARE_INTERFACE_(I,IUnknown) \
|
||||
{ \
|
||||
STDMETHOD(QueryInterface)(IENUM_THIS_(I) REFIID,PVOID*) PURE; \
|
||||
STDMETHOD_(ULONG,AddRef)(IENUM_THIS(I)) PURE; \
|
||||
STDMETHOD_(ULONG,Release)(IENUM_THIS(I)) PURE; \
|
||||
STDMETHOD(Next)(IENUM_THIS_(I) ULONG,T*,ULONG*) PURE; \
|
||||
STDMETHOD(Skip)(IENUM_THIS_(I) ULONG) PURE; \
|
||||
STDMETHOD(Reset)(IENUM_THIS(I)) PURE; \
|
||||
STDMETHOD(Clone)(IENUM_THIS_(I) I**) PURE; \
|
||||
}
|
||||
# define DECLARE_ENUMERATOR(T) DECLARE_ENUMERATOR_(IEnum##T,T)
|
||||
|
||||
#endif /* __OBJC__ */
|
||||
|
||||
#ifdef _GUID_DEFINED
|
||||
# warning _GUID_DEFINED is deprecated, use GUID_DEFINED instead
|
||||
#endif
|
||||
|
||||
#if ! (defined _GUID_DEFINED || defined GUID_DEFINED) /* also defined in winnt.h */
|
||||
#define GUID_DEFINED
|
||||
typedef struct _GUID
|
||||
{
|
||||
unsigned long Data1;
|
||||
unsigned short Data2;
|
||||
unsigned short Data3;
|
||||
unsigned char Data4[8];
|
||||
} GUID,*REFGUID,*LPGUID;
|
||||
#endif /* GUID_DEFINED */
|
||||
#ifndef UUID_DEFINED
|
||||
#define UUID_DEFINED
|
||||
typedef GUID UUID;
|
||||
#endif /* UUID_DEFINED */
|
||||
typedef GUID IID;
|
||||
typedef GUID CLSID;
|
||||
typedef CLSID *LPCLSID;
|
||||
typedef IID *LPIID;
|
||||
typedef IID *REFIID;
|
||||
typedef CLSID *REFCLSID;
|
||||
typedef GUID FMTID;
|
||||
typedef FMTID *REFFMTID;
|
||||
typedef unsigned long error_status_t;
|
||||
#define uuid_t UUID
|
||||
typedef unsigned long PROPID;
|
||||
|
||||
#ifndef _REFGUID_DEFINED
|
||||
#if defined (__cplusplus) && !defined (CINTERFACE)
|
||||
#define REFGUID const GUID&
|
||||
#define REFIID const IID&
|
||||
#define REFCLSID const CLSID&
|
||||
#else
|
||||
#define REFGUID const GUID* const
|
||||
#define REFIID const IID* const
|
||||
#define REFCLSID const CLSID* const
|
||||
#endif
|
||||
#define _REFGUID_DEFINED
|
||||
#define _REFGIID_DEFINED
|
||||
#define _REFCLSID_DEFINED
|
||||
#endif
|
||||
#ifndef GUID_SECTION
|
||||
#define GUID_SECTION ".text"
|
||||
#endif
|
||||
#ifdef __GNUC__
|
||||
#define GUID_SECT __attribute__ ((section (GUID_SECTION)))
|
||||
#else
|
||||
#define GUID_SECT
|
||||
#endif
|
||||
#if !defined(INITGUID) || (defined(INITGUID) && defined(__cplusplus))
|
||||
#define GUID_EXT EXTERN_C
|
||||
#else
|
||||
#define GUID_EXT
|
||||
#endif
|
||||
#ifdef INITGUID
|
||||
#define DEFINE_GUID(n,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) GUID_EXT const GUID n GUID_SECT = {l,w1,w2,{b1,b2,b3,b4,b5,b6,b7,b8}}
|
||||
#define DEFINE_OLEGUID(n,l,w1,w2) DEFINE_GUID(n,l,w1,w2,0xC0,0,0,0,0,0,0,0x46)
|
||||
#else
|
||||
#define DEFINE_GUID(n,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) GUID_EXT const GUID n
|
||||
#define DEFINE_OLEGUID(n,l,w1,w2) DEFINE_GUID(n,l,w1,w2,0xC0,0,0,0,0,0,0,0x46)
|
||||
#endif
|
||||
#endif
|
||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,71 @@
|
||||
// <algorithm> -*- C++ -*-
|
||||
|
||||
// Copyright (C) 2001, 2002 Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 2, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING. If not, write to the Free
|
||||
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
// USA.
|
||||
|
||||
// As a special exception, you may use this file as part of a free software
|
||||
// library without restriction. Specifically, if other files instantiate
|
||||
// templates or use macros or inline functions from this file, or you compile
|
||||
// this file and link it with other files to produce an executable, this
|
||||
// file does not by itself cause the resulting executable to be covered by
|
||||
// the GNU General Public License. This exception does not however
|
||||
// invalidate any other reasons why the executable file might be covered by
|
||||
// the GNU General Public License.
|
||||
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 1994
|
||||
* Hewlett-Packard Company
|
||||
*
|
||||
* Permission to use, copy, modify, distribute and sell this software
|
||||
* and its documentation for any purpose is hereby granted without fee,
|
||||
* provided that the above copyright notice appear in all copies and
|
||||
* that both that copyright notice and this permission notice appear
|
||||
* in supporting documentation. Hewlett-Packard Company makes no
|
||||
* representations about the suitability of this software for any
|
||||
* purpose. It is provided "as is" without express or implied warranty.
|
||||
*
|
||||
*
|
||||
* Copyright (c) 1996,1997
|
||||
* Silicon Graphics Computer Systems, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, distribute and sell this software
|
||||
* and its documentation for any purpose is hereby granted without fee,
|
||||
* provided that the above copyright notice appear in all copies and
|
||||
* that both that copyright notice and this permission notice appear
|
||||
* in supporting documentation. Silicon Graphics makes no
|
||||
* representations about the suitability of this software for any
|
||||
* purpose. It is provided "as is" without express or implied warranty.
|
||||
*/
|
||||
|
||||
/** @file algorithm
|
||||
* This is a Standard C++ Library header. You should @c #include this header
|
||||
* in your programs, rather than any of the "st[dl]_*.h" implementation files.
|
||||
*/
|
||||
|
||||
#ifndef _GLIBCXX_ALGORITHM
|
||||
#define _GLIBCXX_ALGORITHM 1
|
||||
|
||||
#pragma GCC system_header
|
||||
|
||||
#include <bits/stl_algobase.h>
|
||||
#include <bits/stl_construct.h>
|
||||
#include <bits/stl_uninitialized.h>
|
||||
#include <bits/stl_algo.h>
|
||||
|
||||
#endif /* _GLIBCXX_ALGORITHM */
|
||||
@ -0,0 +1,149 @@
|
||||
// Backward-compat support -*- C++ -*-
|
||||
|
||||
// Copyright (C) 2001 Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 2, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING. If not, write to the Free
|
||||
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
// USA.
|
||||
|
||||
// As a special exception, you may use this file as part of a free software
|
||||
// library without restriction. Specifically, if other files instantiate
|
||||
// templates or use macros or inline functions from this file, or you compile
|
||||
// this file and link it with other files to produce an executable, this
|
||||
// file does not by itself cause the resulting executable to be covered by
|
||||
// the GNU General Public License. This exception does not however
|
||||
// invalidate any other reasons why the executable file might be covered by
|
||||
// the GNU General Public License.
|
||||
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 1994
|
||||
* Hewlett-Packard Company
|
||||
*
|
||||
* Permission to use, copy, modify, distribute and sell this software
|
||||
* and its documentation for any purpose is hereby granted without fee,
|
||||
* provided that the above copyright notice appear in all copies and
|
||||
* that both that copyright notice and this permission notice appear
|
||||
* in supporting documentation. Hewlett-Packard Company makes no
|
||||
* representations about the suitability of this software for any
|
||||
* purpose. It is provided "as is" without express or implied warranty.
|
||||
*
|
||||
*
|
||||
* Copyright (c) 1996,1997
|
||||
* Silicon Graphics Computer Systems, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, distribute and sell this software
|
||||
* and its documentation for any purpose is hereby granted without fee,
|
||||
* provided that the above copyright notice appear in all copies and
|
||||
* that both that copyright notice and this permission notice appear
|
||||
* in supporting documentation. Silicon Graphics makes no
|
||||
* representations about the suitability of this software for any
|
||||
* purpose. It is provided "as is" without express or implied warranty.
|
||||
*/
|
||||
|
||||
#ifndef _BACKWARD_ALGO_H
|
||||
#define _BACKWARD_ALGO_H 1
|
||||
|
||||
#include "backward_warning.h"
|
||||
#include "algobase.h"
|
||||
#include "tempbuf.h"
|
||||
#include "iterator.h"
|
||||
#include <bits/stl_algo.h>
|
||||
#include <bits/stl_numeric.h>
|
||||
#include <ext/algorithm>
|
||||
#include <ext/numeric>
|
||||
|
||||
// Names from <stl_algo.h>
|
||||
using std::for_each;
|
||||
using std::find;
|
||||
using std::find_if;
|
||||
using std::adjacent_find;
|
||||
using std::count;
|
||||
using std::count_if;
|
||||
using std::search;
|
||||
using std::search_n;
|
||||
using std::swap_ranges;
|
||||
using std::transform;
|
||||
using std::replace;
|
||||
using std::replace_if;
|
||||
using std::replace_copy;
|
||||
using std::replace_copy_if;
|
||||
using std::generate;
|
||||
using std::generate_n;
|
||||
using std::remove;
|
||||
using std::remove_if;
|
||||
using std::remove_copy;
|
||||
using std::remove_copy_if;
|
||||
using std::unique;
|
||||
using std::unique_copy;
|
||||
using std::reverse;
|
||||
using std::reverse_copy;
|
||||
using std::rotate;
|
||||
using std::rotate_copy;
|
||||
using std::random_shuffle;
|
||||
using std::partition;
|
||||
using std::stable_partition;
|
||||
using std::sort;
|
||||
using std::stable_sort;
|
||||
using std::partial_sort;
|
||||
using std::partial_sort_copy;
|
||||
using std::nth_element;
|
||||
using std::lower_bound;
|
||||
using std::upper_bound;
|
||||
using std::equal_range;
|
||||
using std::binary_search;
|
||||
using std::merge;
|
||||
using std::inplace_merge;
|
||||
using std::includes;
|
||||
using std::set_union;
|
||||
using std::set_intersection;
|
||||
using std::set_difference;
|
||||
using std::set_symmetric_difference;
|
||||
using std::min_element;
|
||||
using std::max_element;
|
||||
using std::next_permutation;
|
||||
using std::prev_permutation;
|
||||
using std::find_first_of;
|
||||
using std::find_end;
|
||||
|
||||
// Names from stl_heap.h
|
||||
using std::push_heap;
|
||||
using std::pop_heap;
|
||||
using std::make_heap;
|
||||
using std::sort_heap;
|
||||
|
||||
// Names from stl_numeric.h
|
||||
using std::accumulate;
|
||||
using std::inner_product;
|
||||
using std::partial_sum;
|
||||
using std::adjacent_difference;
|
||||
|
||||
// Names from ext/algorithm
|
||||
using __gnu_cxx::random_sample;
|
||||
using __gnu_cxx::random_sample_n;
|
||||
using __gnu_cxx::is_sorted;
|
||||
using __gnu_cxx::is_heap;
|
||||
using __gnu_cxx::count; // Extension returning void
|
||||
using __gnu_cxx::count_if; // Extension returning void
|
||||
|
||||
// Names from ext/numeric
|
||||
using __gnu_cxx::power;
|
||||
using __gnu_cxx::iota;
|
||||
|
||||
#endif /* _BACKWARD_ALGO_H */
|
||||
|
||||
// Local Variables:
|
||||
// mode:C++
|
||||
// End:
|
||||
@ -0,0 +1,95 @@
|
||||
// Backward-compat support -*- C++ -*-
|
||||
|
||||
// Copyright (C) 2001 Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 2, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING. If not, write to the Free
|
||||
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
// USA.
|
||||
|
||||
// As a special exception, you may use this file as part of a free software
|
||||
// library without restriction. Specifically, if other files instantiate
|
||||
// templates or use macros or inline functions from this file, or you compile
|
||||
// this file and link it with other files to produce an executable, this
|
||||
// file does not by itself cause the resulting executable to be covered by
|
||||
// the GNU General Public License. This exception does not however
|
||||
// invalidate any other reasons why the executable file might be covered by
|
||||
// the GNU General Public License.
|
||||
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 1994
|
||||
* Hewlett-Packard Company
|
||||
*
|
||||
* Permission to use, copy, modify, distribute and sell this software
|
||||
* and its documentation for any purpose is hereby granted without fee,
|
||||
* provided that the above copyright notice appear in all copies and
|
||||
* that both that copyright notice and this permission notice appear
|
||||
* in supporting documentation. Hewlett-Packard Company makes no
|
||||
* representations about the suitability of this software for any
|
||||
* purpose. It is provided "as is" without express or implied warranty.
|
||||
*
|
||||
* Copyright (c) 1996,1997
|
||||
* Silicon Graphics Computer Systems, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, distribute and sell this software
|
||||
* and its documentation for any purpose is hereby granted without fee,
|
||||
* provided that the above copyright notice appear in all copies and
|
||||
* that both that copyright notice and this permission notice appear
|
||||
* in supporting documentation. Silicon Graphics makes no
|
||||
* representations about the suitability of this software for any
|
||||
* purpose. It is provided "as is" without express or implied warranty.
|
||||
*/
|
||||
|
||||
#ifndef _BACKWARD_ALGOBASE_H
|
||||
#define _BACKWARD_ALGOBASE_H 1
|
||||
|
||||
#include "backward_warning.h"
|
||||
#include "pair.h"
|
||||
#include "iterator.h"
|
||||
#include <bits/stl_algobase.h>
|
||||
#include <bits/stl_uninitialized.h>
|
||||
#include <ext/algorithm>
|
||||
#include <ext/memory>
|
||||
|
||||
// Names from stl_algobase.h
|
||||
using std::iter_swap;
|
||||
using std::swap;
|
||||
using std::min;
|
||||
using std::max;
|
||||
using std::copy;
|
||||
using std::copy_backward;
|
||||
using std::fill;
|
||||
using std::fill_n;
|
||||
using std::mismatch;
|
||||
using std::equal;
|
||||
using std::lexicographical_compare;
|
||||
|
||||
// Names from stl_uninitialized.h
|
||||
using std::uninitialized_copy;
|
||||
using std::uninitialized_fill;
|
||||
using std::uninitialized_fill_n;
|
||||
|
||||
// Names from ext/algorithm
|
||||
using __gnu_cxx::copy_n;
|
||||
using __gnu_cxx::lexicographical_compare_3way;
|
||||
|
||||
// Names from ext/memory
|
||||
using __gnu_cxx::uninitialized_copy_n;
|
||||
|
||||
#endif /* _BACKWARD_ALGOBASE_H */
|
||||
|
||||
// Local Variables:
|
||||
// mode:C++
|
||||
// End:
|
||||
@ -0,0 +1,52 @@
|
||||
// Backward-compat support -*- C++ -*-
|
||||
|
||||
// Copyright (C) 2001, 2003, 2004 Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 2, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING. If not, write to the Free
|
||||
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
// USA.
|
||||
|
||||
// As a special exception, you may use this file as part of a free software
|
||||
// library without restriction. Specifically, if other files instantiate
|
||||
// templates or use macros or inline functions from this file, or you compile
|
||||
// this file and link it with other files to produce an executable, this
|
||||
// file does not by itself cause the resulting executable to be covered by
|
||||
// the GNU General Public License. This exception does not however
|
||||
// invalidate any other reasons why the executable file might be covered by
|
||||
// the GNU General Public License.
|
||||
|
||||
/*
|
||||
* Copyright (c) 1996-1997
|
||||
* Silicon Graphics Computer Systems, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, distribute and sell this software
|
||||
* and its documentation for any purpose is hereby granted without fee,
|
||||
* provided that the above copyright notice appear in all copies and
|
||||
* that both that copyright notice and this permission notice appear
|
||||
* in supporting documentation. Silicon Graphics makes no
|
||||
* representations about the suitability of this software for any
|
||||
* purpose. It is provided "as is" without express or implied warranty.
|
||||
*/
|
||||
|
||||
#ifndef _BACKWARD_ALLOC_H
|
||||
#define _BACKWARD_ALLOC_H 1
|
||||
|
||||
#include "backward_warning.h"
|
||||
#include <bits/c++config.h>
|
||||
#include <bits/allocator.h>
|
||||
|
||||
using std::allocator;
|
||||
|
||||
#endif
|
||||
@ -0,0 +1,39 @@
|
||||
// Copyright (C) 2001 Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 2, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING. If not, write to the Free
|
||||
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
// USA.
|
||||
|
||||
// As a special exception, you may use this file as part of a free software
|
||||
// library without restriction. Specifically, if other files instantiate
|
||||
// templates or use macros or inline functions from this file, or you compile
|
||||
// this file and link it with other files to produce an executable, this
|
||||
// file does not by itself cause the resulting executable to be covered by
|
||||
// the GNU General Public License. This exception does not however
|
||||
// invalidate any other reasons why the executable file might be covered by
|
||||
// the GNU General Public License.
|
||||
|
||||
#ifndef _BACKWARD_BACKWARD_WARNING_H
|
||||
#define _BACKWARD_BACKWARD_WARNING_H 1
|
||||
|
||||
#ifdef __DEPRECATED
|
||||
#warning This file includes at least one deprecated or antiquated header. \
|
||||
Please consider using one of the 32 headers found in section 17.4.1.2 of the \
|
||||
C++ standard. Examples include substituting the <X> header for the <X.h> \
|
||||
header for C++ includes, or <iostream> instead of the deprecated header \
|
||||
<iostream.h>. To disable this warning use -Wno-deprecated.
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@ -0,0 +1,68 @@
|
||||
// Backward-compat support -*- C++ -*-
|
||||
|
||||
// Copyright (C) 2001, 2004 Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 2, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING. If not, write to the Free
|
||||
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
// USA.
|
||||
|
||||
// As a special exception, you may use this file as part of a free software
|
||||
// library without restriction. Specifically, if other files instantiate
|
||||
// templates or use macros or inline functions from this file, or you compile
|
||||
// this file and link it with other files to produce an executable, this
|
||||
// file does not by itself cause the resulting executable to be covered by
|
||||
// the GNU General Public License. This exception does not however
|
||||
// invalidate any other reasons why the executable file might be covered by
|
||||
// the GNU General Public License.
|
||||
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 1994
|
||||
* Hewlett-Packard Company
|
||||
*
|
||||
* Permission to use, copy, modify, distribute and sell this software
|
||||
* and its documentation for any purpose is hereby granted without fee,
|
||||
* provided that the above copyright notice appear in all copies and
|
||||
* that both that copyright notice and this permission notice appear
|
||||
* in supporting documentation. Hewlett-Packard Company makes no
|
||||
* representations about the suitability of this software for any
|
||||
* purpose. It is provided "as is" without express or implied warranty.
|
||||
*
|
||||
*
|
||||
* Copyright (c) 1996
|
||||
* Silicon Graphics Computer Systems, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, distribute and sell this software
|
||||
* and its documentation for any purpose is hereby granted without fee,
|
||||
* provided that the above copyright notice appear in all copies and
|
||||
* that both that copyright notice and this permission notice appear
|
||||
* in supporting documentation. Silicon Graphics makes no
|
||||
* representations about the suitability of this software for any
|
||||
* purpose. It is provided "as is" without express or implied warranty.
|
||||
*/
|
||||
|
||||
#ifndef _BACKWARD_BVECTOR_H
|
||||
#define _BACKWARD_BVECTOR_H 1
|
||||
|
||||
#include "backward_warning.h"
|
||||
#include <vector>
|
||||
|
||||
typedef std::vector<bool, std::allocator<bool> > bit_vector;
|
||||
|
||||
#endif /* _BACKWARD_BVECTOR_H */
|
||||
|
||||
// Local Variables:
|
||||
// mode:C++
|
||||
// End:
|
||||
@ -0,0 +1,43 @@
|
||||
// Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 2, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING. If not, write to the Free
|
||||
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
// USA.
|
||||
|
||||
// As a special exception, you may use this file as part of a free software
|
||||
// library without restriction. Specifically, if other files instantiate
|
||||
// templates or use macros or inline functions from this file, or you compile
|
||||
// this file and link it with other files to produce an executable, this
|
||||
// file does not by itself cause the resulting executable to be covered by
|
||||
// the GNU General Public License. This exception does not however
|
||||
// invalidate any other reasons why the executable file might be covered by
|
||||
// the GNU General Public License.
|
||||
|
||||
#ifndef _BACKWARD_COMPLEX_H
|
||||
#define _BACKWARD_COMPLEX_H 1
|
||||
|
||||
#include "backward_warning.h"
|
||||
#include <complex>
|
||||
|
||||
using std::complex;
|
||||
typedef complex<float> float_complex;
|
||||
typedef complex<double> double_complex;
|
||||
typedef complex<long double> long_double_complex;
|
||||
|
||||
#endif
|
||||
|
||||
// Local Variables:
|
||||
// mode:C++
|
||||
// End:
|
||||
@ -0,0 +1,117 @@
|
||||
// Backward-compat support -*- C++ -*-
|
||||
|
||||
// Copyright (C) 2001 Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 2, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING. If not, write to the Free
|
||||
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
// USA.
|
||||
|
||||
// As a special exception, you may use this file as part of a free software
|
||||
// library without restriction. Specifically, if other files instantiate
|
||||
// templates or use macros or inline functions from this file, or you compile
|
||||
// this file and link it with other files to produce an executable, this
|
||||
// file does not by itself cause the resulting executable to be covered by
|
||||
// the GNU General Public License. This exception does not however
|
||||
// invalidate any other reasons why the executable file might be covered by
|
||||
// the GNU General Public License.
|
||||
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 1994
|
||||
* Hewlett-Packard Company
|
||||
*
|
||||
* Permission to use, copy, modify, distribute and sell this software
|
||||
* and its documentation for any purpose is hereby granted without fee,
|
||||
* provided that the above copyright notice appear in all copies and
|
||||
* that both that copyright notice and this permission notice appear
|
||||
* in supporting documentation. Hewlett-Packard Company makes no
|
||||
* representations about the suitability of this software for any
|
||||
* purpose. It is provided "as is" without express or implied warranty.
|
||||
*
|
||||
*/
|
||||
|
||||
// Inclusion of this file is DEPRECATED. This is the original HP
|
||||
// default allocator. It is provided only for backward compatibility.
|
||||
// This file WILL BE REMOVED in a future release.
|
||||
//
|
||||
// DO NOT USE THIS FILE unless you have an old container implementation
|
||||
// that requires an allocator with the HP-style interface.
|
||||
//
|
||||
// Standard-conforming allocators have a very different interface. The
|
||||
// standard default allocator is declared in the header <memory>.
|
||||
|
||||
#ifndef _BACKWARD_DEFALLOC_H
|
||||
#define _BACKWARD_DEFALLOC_H 1
|
||||
|
||||
#include "backward_warning.h"
|
||||
#include "new.h"
|
||||
#include <stddef.h>
|
||||
#include <stdlib.h>
|
||||
#include <limits.h>
|
||||
#include "iostream.h"
|
||||
#include "algobase.h"
|
||||
|
||||
|
||||
template <class _Tp>
|
||||
inline _Tp* allocate(ptrdiff_t __size, _Tp*) {
|
||||
set_new_handler(0);
|
||||
_Tp* __tmp = (_Tp*)(::operator new((size_t)(__size * sizeof(_Tp))));
|
||||
if (__tmp == 0) {
|
||||
cerr << "out of memory" << endl;
|
||||
exit(1);
|
||||
}
|
||||
return __tmp;
|
||||
}
|
||||
|
||||
|
||||
template <class _Tp>
|
||||
inline void deallocate(_Tp* __buffer) {
|
||||
::operator delete(__buffer);
|
||||
}
|
||||
|
||||
template <class _Tp>
|
||||
class allocator {
|
||||
public:
|
||||
typedef _Tp value_type;
|
||||
typedef _Tp* pointer;
|
||||
typedef const _Tp* const_pointer;
|
||||
typedef _Tp& reference;
|
||||
typedef const _Tp& const_reference;
|
||||
typedef size_t size_type;
|
||||
typedef ptrdiff_t difference_type;
|
||||
pointer allocate(size_type __n) {
|
||||
return ::allocate((difference_type)__n, (pointer)0);
|
||||
}
|
||||
void deallocate(pointer __p) { ::deallocate(__p); }
|
||||
pointer address(reference __x) { return (pointer)&__x; }
|
||||
const_pointer const_address(const_reference __x) {
|
||||
return (const_pointer)&__x;
|
||||
}
|
||||
size_type init_page_size() {
|
||||
return max(size_type(1), size_type(4096/sizeof(_Tp)));
|
||||
}
|
||||
size_type max_size() const {
|
||||
return max(size_type(1), size_type(UINT_MAX/sizeof(_Tp)));
|
||||
}
|
||||
};
|
||||
|
||||
class allocator<void> {
|
||||
public:
|
||||
typedef void* pointer;
|
||||
};
|
||||
|
||||
|
||||
|
||||
#endif /* _BACKWARD_DEFALLOC_H */
|
||||
@ -0,0 +1,70 @@
|
||||
// Backward-compat support -*- C++ -*-
|
||||
|
||||
// Copyright (C) 2001 Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 2, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING. If not, write to the Free
|
||||
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
// USA.
|
||||
|
||||
// As a special exception, you may use this file as part of a free software
|
||||
// library without restriction. Specifically, if other files instantiate
|
||||
// templates or use macros or inline functions from this file, or you compile
|
||||
// this file and link it with other files to produce an executable, this
|
||||
// file does not by itself cause the resulting executable to be covered by
|
||||
// the GNU General Public License. This exception does not however
|
||||
// invalidate any other reasons why the executable file might be covered by
|
||||
// the GNU General Public License.
|
||||
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 1994
|
||||
* Hewlett-Packard Company
|
||||
*
|
||||
* Permission to use, copy, modify, distribute and sell this software
|
||||
* and its documentation for any purpose is hereby granted without fee,
|
||||
* provided that the above copyright notice appear in all copies and
|
||||
* that both that copyright notice and this permission notice appear
|
||||
* in supporting documentation. Hewlett-Packard Company makes no
|
||||
* representations about the suitability of this software for any
|
||||
* purpose. It is provided "as is" without express or implied warranty.
|
||||
*
|
||||
*
|
||||
* Copyright (c) 1997
|
||||
* Silicon Graphics Computer Systems, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, distribute and sell this software
|
||||
* and its documentation for any purpose is hereby granted without fee,
|
||||
* provided that the above copyright notice appear in all copies and
|
||||
* that both that copyright notice and this permission notice appear
|
||||
* in supporting documentation. Silicon Graphics makes no
|
||||
* representations about the suitability of this software for any
|
||||
* purpose. It is provided "as is" without express or implied warranty.
|
||||
*/
|
||||
|
||||
#ifndef _BACKWARD_DEQUE_H
|
||||
#define _BACKWARD_DEQUE_H 1
|
||||
|
||||
#include "backward_warning.h"
|
||||
#include "algobase.h"
|
||||
#include "alloc.h"
|
||||
#include <deque>
|
||||
|
||||
using std::deque;
|
||||
|
||||
#endif /* _BACKWARD_DEQUE_H */
|
||||
|
||||
// Local Variables:
|
||||
// mode:C++
|
||||
// End:
|
||||
@ -0,0 +1,52 @@
|
||||
// Copyright (C) 2000, 2001 Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 2, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING. If not, write to the Free
|
||||
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
// USA.
|
||||
|
||||
// As a special exception, you may use this file as part of a free software
|
||||
// library without restriction. Specifically, if other files instantiate
|
||||
// templates or use macros or inline functions from this file, or you compile
|
||||
// this file and link it with other files to produce an executable, this
|
||||
// file does not by itself cause the resulting executable to be covered by
|
||||
// the GNU General Public License. This exception does not however
|
||||
// invalidate any other reasons why the executable file might be covered by
|
||||
// the GNU General Public License.
|
||||
|
||||
#ifndef _BACKWARD_FSTREAM_H
|
||||
#define _BACKWARD_FSTREAM_H 1
|
||||
|
||||
#include "backward_warning.h"
|
||||
#include <fstream>
|
||||
|
||||
using std::filebuf;
|
||||
using std::ifstream;
|
||||
using std::ofstream;
|
||||
using std::fstream;
|
||||
using std::streampos;
|
||||
|
||||
#ifdef _GLIBCXX_USE_WCHAR_T
|
||||
using std::wfilebuf;
|
||||
using std::wifstream;
|
||||
using std::wofstream;
|
||||
using std::wfstream;
|
||||
using std::wstreampos;
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
// Local Variables:
|
||||
// mode:C++
|
||||
// End:
|
||||
@ -0,0 +1,130 @@
|
||||
// Backward-compat support -*- C++ -*-
|
||||
|
||||
// Copyright (C) 2001 Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 2, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING. If not, write to the Free
|
||||
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
// USA.
|
||||
|
||||
// As a special exception, you may use this file as part of a free software
|
||||
// library without restriction. Specifically, if other files instantiate
|
||||
// templates or use macros or inline functions from this file, or you compile
|
||||
// this file and link it with other files to produce an executable, this
|
||||
// file does not by itself cause the resulting executable to be covered by
|
||||
// the GNU General Public License. This exception does not however
|
||||
// invalidate any other reasons why the executable file might be covered by
|
||||
// the GNU General Public License.
|
||||
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 1994
|
||||
* Hewlett-Packard Company
|
||||
*
|
||||
* Permission to use, copy, modify, distribute and sell this software
|
||||
* and its documentation for any purpose is hereby granted without fee,
|
||||
* provided that the above copyright notice appear in all copies and
|
||||
* that both that copyright notice and this permission notice appear
|
||||
* in supporting documentation. Hewlett-Packard Company makes no
|
||||
* representations about the suitability of this software for any
|
||||
* purpose. It is provided "as is" without express or implied warranty.
|
||||
*
|
||||
*
|
||||
* Copyright (c) 1996,1997
|
||||
* Silicon Graphics Computer Systems, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, distribute and sell this software
|
||||
* and its documentation for any purpose is hereby granted without fee,
|
||||
* provided that the above copyright notice appear in all copies and
|
||||
* that both that copyright notice and this permission notice appear
|
||||
* in supporting documentation. Silicon Graphics makes no
|
||||
* representations about the suitability of this software for any
|
||||
* purpose. It is provided "as is" without express or implied warranty.
|
||||
*/
|
||||
|
||||
#ifndef _BACKWARD_FUNCTION_H
|
||||
#define _BACKWARD_FUNCTION_H 1
|
||||
|
||||
#include "backward_warning.h"
|
||||
#include <bits/c++config.h>
|
||||
#include <stddef.h>
|
||||
#include <bits/stl_function.h>
|
||||
#include <ext/functional>
|
||||
|
||||
// Names from stl_function.h
|
||||
using std::unary_function;
|
||||
using std::binary_function;
|
||||
using std::plus;
|
||||
using std::minus;
|
||||
using std::multiplies;
|
||||
using std::divides;
|
||||
using std::modulus;
|
||||
using std::negate;
|
||||
using std::equal_to;
|
||||
using std::not_equal_to;
|
||||
using std::greater;
|
||||
using std::less;
|
||||
using std::greater_equal;
|
||||
using std::less_equal;
|
||||
using std::logical_and;
|
||||
using std::logical_or;
|
||||
using std::logical_not;
|
||||
using std::unary_negate;
|
||||
using std::binary_negate;
|
||||
using std::not1;
|
||||
using std::not2;
|
||||
using std::binder1st;
|
||||
using std::binder2nd;
|
||||
using std::bind1st;
|
||||
using std::bind2nd;
|
||||
using std::pointer_to_unary_function;
|
||||
using std::pointer_to_binary_function;
|
||||
using std::ptr_fun;
|
||||
using std::mem_fun_t;
|
||||
using std::const_mem_fun_t;
|
||||
using std::mem_fun_ref_t;
|
||||
using std::const_mem_fun_ref_t;
|
||||
using std::mem_fun1_t;
|
||||
using std::const_mem_fun1_t;
|
||||
using std::mem_fun1_ref_t;
|
||||
using std::const_mem_fun1_ref_t;
|
||||
using std::mem_fun;
|
||||
using std::mem_fun_ref;
|
||||
|
||||
// Names from ext/functional
|
||||
using __gnu_cxx::identity_element;
|
||||
using __gnu_cxx::unary_compose;
|
||||
using __gnu_cxx::binary_compose;
|
||||
using __gnu_cxx::compose1;
|
||||
using __gnu_cxx::compose2;
|
||||
using __gnu_cxx::identity;
|
||||
using __gnu_cxx::select1st;
|
||||
using __gnu_cxx::select2nd;
|
||||
using __gnu_cxx::project1st;
|
||||
using __gnu_cxx::project2nd;
|
||||
using __gnu_cxx::constant_void_fun;
|
||||
using __gnu_cxx::constant_unary_fun;
|
||||
using __gnu_cxx::constant_binary_fun;
|
||||
using __gnu_cxx::constant0;
|
||||
using __gnu_cxx::constant1;
|
||||
using __gnu_cxx::constant2;
|
||||
using __gnu_cxx::subtractive_rng;
|
||||
using __gnu_cxx::mem_fun1;
|
||||
using __gnu_cxx::mem_fun1_ref;
|
||||
|
||||
#endif /* _BACKWARD_FUNCTION_H */
|
||||
|
||||
// Local Variables:
|
||||
// mode:C++
|
||||
// End:
|
||||
@ -0,0 +1,72 @@
|
||||
// Backward-compat support -*- C++ -*-
|
||||
|
||||
// Copyright (C) 2001 Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 2, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING. If not, write to the Free
|
||||
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
// USA.
|
||||
|
||||
// As a special exception, you may use this file as part of a free software
|
||||
// library without restriction. Specifically, if other files instantiate
|
||||
// templates or use macros or inline functions from this file, or you compile
|
||||
// this file and link it with other files to produce an executable, this
|
||||
// file does not by itself cause the resulting executable to be covered by
|
||||
// the GNU General Public License. This exception does not however
|
||||
// invalidate any other reasons why the executable file might be covered by
|
||||
// the GNU General Public License.
|
||||
|
||||
/*
|
||||
* Copyright (c) 1996
|
||||
* Silicon Graphics Computer Systems, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, distribute and sell this software
|
||||
* and its documentation for any purpose is hereby granted without fee,
|
||||
* provided that the above copyright notice appear in all copies and
|
||||
* that both that copyright notice and this permission notice appear
|
||||
* in supporting documentation. Silicon Graphics makes no
|
||||
* representations about the suitability of this software for any
|
||||
* purpose. It is provided "as is" without express or implied warranty.
|
||||
*
|
||||
*
|
||||
* Copyright (c) 1994
|
||||
* Hewlett-Packard Company
|
||||
*
|
||||
* Permission to use, copy, modify, distribute and sell this software
|
||||
* and its documentation for any purpose is hereby granted without fee,
|
||||
* provided that the above copyright notice appear in all copies and
|
||||
* that both that copyright notice and this permission notice appear
|
||||
* in supporting documentation. Hewlett-Packard Company makes no
|
||||
* representations about the suitability of this software for any
|
||||
* purpose. It is provided "as is" without express or implied warranty.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _BACKWARD_HASH_MAP_H
|
||||
#define _BACKWARD_HASH_MAP_H 1
|
||||
|
||||
#include "backward_warning.h"
|
||||
#include "algobase.h"
|
||||
#include <ext/hash_map>
|
||||
|
||||
using __gnu_cxx::hash;
|
||||
using __gnu_cxx::hashtable;
|
||||
using __gnu_cxx::hash_map;
|
||||
using __gnu_cxx::hash_multimap;
|
||||
|
||||
#endif /* _BACKWARD_HASH_MAP_H */
|
||||
|
||||
// Local Variables:
|
||||
// mode:C++
|
||||
// End:
|
||||
@ -0,0 +1,69 @@
|
||||
// Backward-compat support -*- C++ -*-
|
||||
|
||||
// Copyright (C) 2001 Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 2, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING. If not, write to the Free
|
||||
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
// USA.
|
||||
|
||||
// As a special exception, you may use this file as part of a free software
|
||||
// library without restriction. Specifically, if other files instantiate
|
||||
// templates or use macros or inline functions from this file, or you compile
|
||||
// this file and link it with other files to produce an executable, this
|
||||
// file does not by itself cause the resulting executable to be covered by
|
||||
// the GNU General Public License. This exception does not however
|
||||
// invalidate any other reasons why the executable file might be covered by
|
||||
// the GNU General Public License.
|
||||
|
||||
/*
|
||||
* Copyright (c) 1996
|
||||
* Silicon Graphics Computer Systems, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, distribute and sell this software
|
||||
* and its documentation for any purpose is hereby granted without fee,
|
||||
* provided that the above copyright notice appear in all copies and
|
||||
* that both that copyright notice and this permission notice appear
|
||||
* in supporting documentation. Silicon Graphics makes no
|
||||
* representations about the suitability of this software for any
|
||||
* purpose. It is provided "as is" without express or implied warranty.
|
||||
*
|
||||
*
|
||||
* Copyright (c) 1994
|
||||
* Hewlett-Packard Company
|
||||
*
|
||||
* Permission to use, copy, modify, distribute and sell this software
|
||||
* and its documentation for any purpose is hereby granted without fee,
|
||||
* provided that the above copyright notice appear in all copies and
|
||||
* that both that copyright notice and this permission notice appear
|
||||
* in supporting documentation. Hewlett-Packard Company makes no
|
||||
* representations about the suitability of this software for any
|
||||
* purpose. It is provided "as is" without express or implied warranty.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _BACKWARD_HASH_SET_H
|
||||
#define _BACKWARD_HASH_SET_H 1
|
||||
|
||||
#include "backward_warning.h"
|
||||
#include "algobase.h"
|
||||
#include <ext/hash_set>
|
||||
|
||||
using __gnu_cxx::hash;
|
||||
using __gnu_cxx::hashtable;
|
||||
using __gnu_cxx::hash_set;
|
||||
using __gnu_cxx::hash_multiset;
|
||||
|
||||
#endif /* _BACKWARD_HASH_SET_H */
|
||||
|
||||
@ -0,0 +1,76 @@
|
||||
// Backward-compat support -*- C++ -*-
|
||||
|
||||
// Copyright (C) 2001 Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 2, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING. If not, write to the Free
|
||||
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
// USA.
|
||||
|
||||
// As a special exception, you may use this file as part of a free software
|
||||
// library without restriction. Specifically, if other files instantiate
|
||||
// templates or use macros or inline functions from this file, or you compile
|
||||
// this file and link it with other files to produce an executable, this
|
||||
// file does not by itself cause the resulting executable to be covered by
|
||||
// the GNU General Public License. This exception does not however
|
||||
// invalidate any other reasons why the executable file might be covered by
|
||||
// the GNU General Public License.
|
||||
|
||||
/*
|
||||
* Copyright (c) 1996,1997
|
||||
* Silicon Graphics Computer Systems, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, distribute and sell this software
|
||||
* and its documentation for any purpose is hereby granted without fee,
|
||||
* provided that the above copyright notice appear in all copies and
|
||||
* that both that copyright notice and this permission notice appear
|
||||
* in supporting documentation. Silicon Graphics makes no
|
||||
* representations about the suitability of this software for any
|
||||
* purpose. It is provided "as is" without express or implied warranty.
|
||||
*
|
||||
*
|
||||
* Copyright (c) 1994
|
||||
* Hewlett-Packard Company
|
||||
*
|
||||
* Permission to use, copy, modify, distribute and sell this software
|
||||
* and its documentation for any purpose is hereby granted without fee,
|
||||
* provided that the above copyright notice appear in all copies and
|
||||
* that both that copyright notice and this permission notice appear
|
||||
* in supporting documentation. Hewlett-Packard Company makes no
|
||||
* representations about the suitability of this software for any
|
||||
* purpose. It is provided "as is" without express or implied warranty.
|
||||
*
|
||||
*/
|
||||
|
||||
/* NOTE: This is an internal header file, included by other STL headers.
|
||||
* You should not attempt to use it directly.
|
||||
*/
|
||||
|
||||
#ifndef _BACKWARD_HASHTABLE_H
|
||||
#define _BACKWARD_HASHTABLE_H 1
|
||||
|
||||
#include "backward_warning.h"
|
||||
#include <ext/hashtable.h>
|
||||
#include "algo.h"
|
||||
#include "alloc.h"
|
||||
#include "vector.h"
|
||||
|
||||
using __gnu_cxx::hash;
|
||||
using __gnu_cxx::hashtable;
|
||||
|
||||
#endif /* _BACKWARD_HASHTABLE_H */
|
||||
|
||||
// Local Variables:
|
||||
// mode:C++
|
||||
// End:
|
||||
@ -0,0 +1,71 @@
|
||||
// Backward-compat support -*- C++ -*-
|
||||
|
||||
// Copyright (C) 2001 Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 2, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING. If not, write to the Free
|
||||
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
// USA.
|
||||
|
||||
// As a special exception, you may use this file as part of a free software
|
||||
// library without restriction. Specifically, if other files instantiate
|
||||
// templates or use macros or inline functions from this file, or you compile
|
||||
// this file and link it with other files to produce an executable, this
|
||||
// file does not by itself cause the resulting executable to be covered by
|
||||
// the GNU General Public License. This exception does not however
|
||||
// invalidate any other reasons why the executable file might be covered by
|
||||
// the GNU General Public License.
|
||||
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 1994
|
||||
* Hewlett-Packard Company
|
||||
*
|
||||
* Permission to use, copy, modify, distribute and sell this software
|
||||
* and its documentation for any purpose is hereby granted without fee,
|
||||
* provided that the above copyright notice appear in all copies and
|
||||
* that both that copyright notice and this permission notice appear
|
||||
* in supporting documentation. Hewlett-Packard Company makes no
|
||||
* representations about the suitability of this software for any
|
||||
* purpose. It is provided "as is" without express or implied warranty.
|
||||
*
|
||||
* Copyright (c) 1997
|
||||
* Silicon Graphics Computer Systems, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, distribute and sell this software
|
||||
* and its documentation for any purpose is hereby granted without fee,
|
||||
* provided that the above copyright notice appear in all copies and
|
||||
* that both that copyright notice and this permission notice appear
|
||||
* in supporting documentation. Silicon Graphics makes no
|
||||
* representations about the suitability of this software for any
|
||||
* purpose. It is provided "as is" without express or implied warranty.
|
||||
*/
|
||||
|
||||
#ifndef _BACKWARD_HEAP_H
|
||||
#define _BACKWARD_HEAP_H 1
|
||||
|
||||
#include "backward_warning.h"
|
||||
#include <bits/c++config.h>
|
||||
#include <bits/stl_heap.h>
|
||||
|
||||
using std::push_heap;
|
||||
using std::pop_heap;
|
||||
using std::make_heap;
|
||||
using std::sort_heap;
|
||||
|
||||
#endif /* _BACKWARD_HEAP_H */
|
||||
|
||||
// Local Variables:
|
||||
// mode:C++
|
||||
// End:
|
||||
@ -0,0 +1,70 @@
|
||||
// Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 2, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING. If not, write to the Free
|
||||
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
// USA.
|
||||
|
||||
// As a special exception, you may use this file as part of a free software
|
||||
// library without restriction. Specifically, if other files instantiate
|
||||
// templates or use macros or inline functions from this file, or you compile
|
||||
// this file and link it with other files to produce an executable, this
|
||||
// file does not by itself cause the resulting executable to be covered by
|
||||
// the GNU General Public License. This exception does not however
|
||||
// invalidate any other reasons why the executable file might be covered by
|
||||
// the GNU General Public License.
|
||||
|
||||
#ifndef _BACKWARD_IOMANIP_H
|
||||
#define _BACKWARD_IOMANIP_H 1
|
||||
|
||||
#include "backward_warning.h"
|
||||
#include "iostream.h"
|
||||
#include <iomanip>
|
||||
|
||||
// These are from <ios> as per [27.4].
|
||||
using std::boolalpha;
|
||||
using std::noboolalpha;
|
||||
using std::showbase;
|
||||
using std::noshowbase;
|
||||
using std::showpoint;
|
||||
using std::noshowpoint;
|
||||
using std::showpos;
|
||||
using std::noshowpos;
|
||||
using std::skipws;
|
||||
using std::noskipws;
|
||||
using std::uppercase;
|
||||
using std::nouppercase;
|
||||
using std::internal;
|
||||
using std::left;
|
||||
using std::right;
|
||||
using std::dec;
|
||||
using std::hex;
|
||||
using std::oct;
|
||||
using std::fixed;
|
||||
using std::scientific;
|
||||
|
||||
// These are from <iomanip> as per [27.6]. Manipulators from <istream>
|
||||
// and <ostream> (e.g., endl) are made available via <iostream.h>.
|
||||
using std::resetiosflags;
|
||||
using std::setiosflags;
|
||||
using std::setbase;
|
||||
using std::setfill;
|
||||
using std::setprecision;
|
||||
using std::setw;
|
||||
|
||||
#endif
|
||||
|
||||
// Local Variables:
|
||||
// mode:C++
|
||||
// End:
|
||||
@ -0,0 +1,60 @@
|
||||
// Copyright (C) 1997-1999, 2000 Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 2, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING. If not, write to the Free
|
||||
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
// USA.
|
||||
|
||||
// As a special exception, you may use this file as part of a free software
|
||||
// library without restriction. Specifically, if other files instantiate
|
||||
// templates or use macros or inline functions from this file, or you compile
|
||||
// this file and link it with other files to produce an executable, this
|
||||
// file does not by itself cause the resulting executable to be covered by
|
||||
// the GNU General Public License. This exception does not however
|
||||
// invalidate any other reasons why the executable file might be covered by
|
||||
// the GNU General Public License.
|
||||
|
||||
#ifndef _BACKWARD_IOSTREAM_H
|
||||
#define _BACKWARD_IOSTREAM_H 1
|
||||
|
||||
#include "backward_warning.h"
|
||||
#include <iostream>
|
||||
|
||||
using std::iostream;
|
||||
using std::ostream;
|
||||
using std::istream;
|
||||
using std::ios;
|
||||
using std::streambuf;
|
||||
|
||||
using std::cout;
|
||||
using std::cin;
|
||||
using std::cerr;
|
||||
using std::clog;
|
||||
#ifdef _GLIBCXX_USE_WCHAR_T
|
||||
using std::wcout;
|
||||
using std::wcin;
|
||||
using std::wcerr;
|
||||
using std::wclog;
|
||||
#endif
|
||||
|
||||
using std::ws;
|
||||
using std::endl;
|
||||
using std::ends;
|
||||
using std::flush;
|
||||
|
||||
#endif
|
||||
|
||||
// Local Variables:
|
||||
// mode:C++
|
||||
// End:
|
||||
@ -0,0 +1,43 @@
|
||||
// Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 2, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING. If not, write to the Free
|
||||
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
// USA.
|
||||
|
||||
// As a special exception, you may use this file as part of a free software
|
||||
// library without restriction. Specifically, if other files instantiate
|
||||
// templates or use macros or inline functions from this file, or you compile
|
||||
// this file and link it with other files to produce an executable, this
|
||||
// file does not by itself cause the resulting executable to be covered by
|
||||
// the GNU General Public License. This exception does not however
|
||||
// invalidate any other reasons why the executable file might be covered by
|
||||
// the GNU General Public License.
|
||||
|
||||
#ifndef _BACKWARD_ISTREAM_H
|
||||
#define _BACKWARD_ISTREAM_H 1
|
||||
|
||||
#include "backward_warning.h"
|
||||
#include "iostream.h"
|
||||
|
||||
#endif
|
||||
|
||||
// Local Variables:
|
||||
// mode:C++
|
||||
// End:
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@ -0,0 +1,162 @@
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 1994
|
||||
* Hewlett-Packard Company
|
||||
*
|
||||
* Permission to use, copy, modify, distribute and sell this software
|
||||
* and its documentation for any purpose is hereby granted without fee,
|
||||
* provided that the above copyright notice appear in all copies and
|
||||
* that both that copyright notice and this permission notice appear
|
||||
* in supporting documentation. Hewlett-Packard Company makes no
|
||||
* representations about the suitability of this software for any
|
||||
* purpose. It is provided "as is" without express or implied warranty.
|
||||
*
|
||||
*
|
||||
* Copyright (c) 1996
|
||||
* Silicon Graphics Computer Systems, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, distribute and sell this software
|
||||
* and its documentation for any purpose is hereby granted without fee,
|
||||
* provided that the above copyright notice appear in all copies and
|
||||
* that both that copyright notice and this permission notice appear
|
||||
* in supporting documentation. Silicon Graphics makes no
|
||||
* representations about the suitability of this software for any
|
||||
* purpose. It is provided "as is" without express or implied warranty.
|
||||
*/
|
||||
|
||||
#ifndef _BACKWARD_ITERATOR_H
|
||||
#define _BACKWARD_ITERATOR_H 1
|
||||
|
||||
#include "backward_warning.h"
|
||||
#include "function.h"
|
||||
#include <stddef.h>
|
||||
#include "iostream.h"
|
||||
#include <iterator>
|
||||
|
||||
#include <bits/stl_construct.h>
|
||||
#include <bits/stl_raw_storage_iter.h>
|
||||
|
||||
#include <ext/iterator> // For 3-parameter distance extension
|
||||
|
||||
// Names from stl_iterator.h
|
||||
using std::input_iterator_tag;
|
||||
using std::output_iterator_tag;
|
||||
using std::forward_iterator_tag;
|
||||
using std::bidirectional_iterator_tag;
|
||||
using std::random_access_iterator_tag;
|
||||
|
||||
#if 0
|
||||
using std::iterator;
|
||||
#endif
|
||||
|
||||
// The base classes input_iterator, output_iterator, forward_iterator,
|
||||
// bidirectional_iterator, and random_access_iterator are not part of
|
||||
// the C++ standard. (They have been replaced by struct iterator.)
|
||||
// They are included for backward compatibility with the HP STL.
|
||||
template<typename _Tp, typename _Distance>
|
||||
struct input_iterator {
|
||||
typedef input_iterator_tag iterator_category;
|
||||
typedef _Tp value_type;
|
||||
typedef _Distance difference_type;
|
||||
typedef _Tp* pointer;
|
||||
typedef _Tp& reference;
|
||||
};
|
||||
|
||||
struct output_iterator {
|
||||
typedef output_iterator_tag iterator_category;
|
||||
typedef void value_type;
|
||||
typedef void difference_type;
|
||||
typedef void pointer;
|
||||
typedef void reference;
|
||||
};
|
||||
|
||||
template<typename _Tp, typename _Distance>
|
||||
struct forward_iterator {
|
||||
typedef forward_iterator_tag iterator_category;
|
||||
typedef _Tp value_type;
|
||||
typedef _Distance difference_type;
|
||||
typedef _Tp* pointer;
|
||||
typedef _Tp& reference;
|
||||
};
|
||||
|
||||
template<typename _Tp, typename _Distance>
|
||||
struct bidirectional_iterator {
|
||||
typedef bidirectional_iterator_tag iterator_category;
|
||||
typedef _Tp value_type;
|
||||
typedef _Distance difference_type;
|
||||
typedef _Tp* pointer;
|
||||
typedef _Tp& reference;
|
||||
};
|
||||
|
||||
template<typename _Tp, typename _Distance>
|
||||
struct random_access_iterator {
|
||||
typedef random_access_iterator_tag iterator_category;
|
||||
typedef _Tp value_type;
|
||||
typedef _Distance difference_type;
|
||||
typedef _Tp* pointer;
|
||||
typedef _Tp& reference;
|
||||
};
|
||||
|
||||
using std::iterator_traits;
|
||||
|
||||
template <class _Iter>
|
||||
inline typename iterator_traits<_Iter>::iterator_category
|
||||
iterator_category(const _Iter& __i)
|
||||
{ return __iterator_category(__i); }
|
||||
|
||||
template <class _Iter>
|
||||
inline typename iterator_traits<_Iter>::difference_type*
|
||||
distance_type(const _Iter&)
|
||||
{ return static_cast<typename iterator_traits<_Iter>::difference_type*>(0); }
|
||||
|
||||
template<class _Iter>
|
||||
inline typename iterator_traits<_Iter>::value_type*
|
||||
value_type(const _Iter& __i)
|
||||
{ return static_cast<typename iterator_traits<_Iter>::value_type*>(0); }
|
||||
|
||||
using std::distance;
|
||||
using __gnu_cxx::distance; // 3-parameter extension
|
||||
using std::advance;
|
||||
|
||||
using std::insert_iterator;
|
||||
using std::front_insert_iterator;
|
||||
using std::back_insert_iterator;
|
||||
using std::inserter;
|
||||
using std::front_inserter;
|
||||
using std::back_inserter;
|
||||
|
||||
using std::reverse_iterator;
|
||||
|
||||
using std::istream_iterator;
|
||||
using std::ostream_iterator;
|
||||
|
||||
// Names from stl_construct.h
|
||||
template<class _T1, class _T2>
|
||||
inline void
|
||||
construct(_T1* __p, const _T2& __value)
|
||||
{ std::_Construct(__p, __value); }
|
||||
|
||||
template<class _T1>
|
||||
inline void
|
||||
construct(_T1* __p)
|
||||
{ std::_Construct(__p); }
|
||||
|
||||
template <class _Tp>
|
||||
inline void
|
||||
destroy(_Tp* __pointer)
|
||||
{ std::_Destroy(__pointer); }
|
||||
|
||||
template <class _ForwardIterator>
|
||||
inline void
|
||||
destroy(_ForwardIterator __first, _ForwardIterator __last)
|
||||
{ std::_Destroy(__first, __last); }
|
||||
|
||||
|
||||
// Names from stl_raw_storage_iter.h
|
||||
using std::raw_storage_iterator;
|
||||
|
||||
#endif /* _BACKWARD_ITERATOR_H */
|
||||
|
||||
// Local Variables:
|
||||
// mode:C++
|
||||
// End:
|
||||
@ -0,0 +1,70 @@
|
||||
// Backward-compat support -*- C++ -*-
|
||||
|
||||
// Copyright (C) 2001 Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 2, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING. If not, write to the Free
|
||||
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
// USA.
|
||||
|
||||
// As a special exception, you may use this file as part of a free software
|
||||
// library without restriction. Specifically, if other files instantiate
|
||||
// templates or use macros or inline functions from this file, or you compile
|
||||
// this file and link it with other files to produce an executable, this
|
||||
// file does not by itself cause the resulting executable to be covered by
|
||||
// the GNU General Public License. This exception does not however
|
||||
// invalidate any other reasons why the executable file might be covered by
|
||||
// the GNU General Public License.
|
||||
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 1994
|
||||
* Hewlett-Packard Company
|
||||
*
|
||||
* Permission to use, copy, modify, distribute and sell this software
|
||||
* and its documentation for any purpose is hereby granted without fee,
|
||||
* provided that the above copyright notice appear in all copies and
|
||||
* that both that copyright notice and this permission notice appear
|
||||
* in supporting documentation. Hewlett-Packard Company makes no
|
||||
* representations about the suitability of this software for any
|
||||
* purpose. It is provided "as is" without express or implied warranty.
|
||||
*
|
||||
*
|
||||
* Copyright (c) 1996,1997
|
||||
* Silicon Graphics Computer Systems, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, distribute and sell this software
|
||||
* and its documentation for any purpose is hereby granted without fee,
|
||||
* provided that the above copyright notice appear in all copies and
|
||||
* that both that copyright notice and this permission notice appear
|
||||
* in supporting documentation. Silicon Graphics makes no
|
||||
* representations about the suitability of this software for any
|
||||
* purpose. It is provided "as is" without express or implied warranty.
|
||||
*/
|
||||
|
||||
#ifndef _BACKWARD_LIST_H
|
||||
#define _BACKWARD_LIST_H 1
|
||||
|
||||
#include "backward_warning.h"
|
||||
#include "algobase.h"
|
||||
#include "alloc.h"
|
||||
#include <list>
|
||||
|
||||
using std::list;
|
||||
|
||||
#endif /* _BACKWARD_LIST_H */
|
||||
|
||||
// Local Variables:
|
||||
// mode:C++
|
||||
// End:
|
||||
@ -0,0 +1,69 @@
|
||||
// Backward-compat support -*- C++ -*-
|
||||
|
||||
// Copyright (C) 2001 Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 2, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING. If not, write to the Free
|
||||
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
// USA.
|
||||
|
||||
// As a special exception, you may use this file as part of a free software
|
||||
// library without restriction. Specifically, if other files instantiate
|
||||
// templates or use macros or inline functions from this file, or you compile
|
||||
// this file and link it with other files to produce an executable, this
|
||||
// file does not by itself cause the resulting executable to be covered by
|
||||
// the GNU General Public License. This exception does not however
|
||||
// invalidate any other reasons why the executable file might be covered by
|
||||
// the GNU General Public License.
|
||||
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 1994
|
||||
* Hewlett-Packard Company
|
||||
*
|
||||
* Permission to use, copy, modify, distribute and sell this software
|
||||
* and its documentation for any purpose is hereby granted without fee,
|
||||
* provided that the above copyright notice appear in all copies and
|
||||
* that both that copyright notice and this permission notice appear
|
||||
* in supporting documentation. Hewlett-Packard Company makes no
|
||||
* representations about the suitability of this software for any
|
||||
* purpose. It is provided "as is" without express or implied warranty.
|
||||
*
|
||||
*
|
||||
* Copyright (c) 1996,1997
|
||||
* Silicon Graphics Computer Systems, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, distribute and sell this software
|
||||
* and its documentation for any purpose is hereby granted without fee,
|
||||
* provided that the above copyright notice appear in all copies and
|
||||
* that both that copyright notice and this permission notice appear
|
||||
* in supporting documentation. Silicon Graphics makes no
|
||||
* representations about the suitability of this software for any
|
||||
* purpose. It is provided "as is" without express or implied warranty.
|
||||
*/
|
||||
|
||||
#ifndef _BACKWARD_MAP_H
|
||||
#define _BACKWARD_MAP_H 1
|
||||
|
||||
#include "backward_warning.h"
|
||||
#include "tree.h"
|
||||
#include <map>
|
||||
|
||||
using std::map;
|
||||
|
||||
#endif /* _BACKWARD_MAP_H */
|
||||
|
||||
// Local Variables:
|
||||
// mode:C++
|
||||
// End:
|
||||
@ -0,0 +1,69 @@
|
||||
// Backward-compat support -*- C++ -*-
|
||||
|
||||
// Copyright (C) 2001 Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 2, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING. If not, write to the Free
|
||||
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
// USA.
|
||||
|
||||
// As a special exception, you may use this file as part of a free software
|
||||
// library without restriction. Specifically, if other files instantiate
|
||||
// templates or use macros or inline functions from this file, or you compile
|
||||
// this file and link it with other files to produce an executable, this
|
||||
// file does not by itself cause the resulting executable to be covered by
|
||||
// the GNU General Public License. This exception does not however
|
||||
// invalidate any other reasons why the executable file might be covered by
|
||||
// the GNU General Public License.
|
||||
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 1994
|
||||
* Hewlett-Packard Company
|
||||
*
|
||||
* Permission to use, copy, modify, distribute and sell this software
|
||||
* and its documentation for any purpose is hereby granted without fee,
|
||||
* provided that the above copyright notice appear in all copies and
|
||||
* that both that copyright notice and this permission notice appear
|
||||
* in supporting documentation. Hewlett-Packard Company makes no
|
||||
* representations about the suitability of this software for any
|
||||
* purpose. It is provided "as is" without express or implied warranty.
|
||||
*
|
||||
*
|
||||
* Copyright (c) 1996,1997
|
||||
* Silicon Graphics Computer Systems, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, distribute and sell this software
|
||||
* and its documentation for any purpose is hereby granted without fee,
|
||||
* provided that the above copyright notice appear in all copies and
|
||||
* that both that copyright notice and this permission notice appear
|
||||
* in supporting documentation. Silicon Graphics makes no
|
||||
* representations about the suitability of this software for any
|
||||
* purpose. It is provided "as is" without express or implied warranty.
|
||||
*/
|
||||
|
||||
#ifndef _BACKWARD_MULTIMAP_H
|
||||
#define _BACKWARD_MULTIMAP_H 1
|
||||
|
||||
#include "backward_warning.h"
|
||||
#include "tree.h"
|
||||
#include <map>
|
||||
|
||||
using std::multimap;
|
||||
|
||||
#endif /* _BACKWARD_MULTIMAP_H */
|
||||
|
||||
// Local Variables:
|
||||
// mode:C++
|
||||
// End:
|
||||
@ -0,0 +1,69 @@
|
||||
// Backward-compat support -*- C++ -*-
|
||||
|
||||
// Copyright (C) 2001 Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 2, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING. If not, write to the Free
|
||||
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
// USA.
|
||||
|
||||
// As a special exception, you may use this file as part of a free software
|
||||
// library without restriction. Specifically, if other files instantiate
|
||||
// templates or use macros or inline functions from this file, or you compile
|
||||
// this file and link it with other files to produce an executable, this
|
||||
// file does not by itself cause the resulting executable to be covered by
|
||||
// the GNU General Public License. This exception does not however
|
||||
// invalidate any other reasons why the executable file might be covered by
|
||||
// the GNU General Public License.
|
||||
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 1994
|
||||
* Hewlett-Packard Company
|
||||
*
|
||||
* Permission to use, copy, modify, distribute and sell this software
|
||||
* and its documentation for any purpose is hereby granted without fee,
|
||||
* provided that the above copyright notice appear in all copies and
|
||||
* that both that copyright notice and this permission notice appear
|
||||
* in supporting documentation. Hewlett-Packard Company makes no
|
||||
* representations about the suitability of this software for any
|
||||
* purpose. It is provided "as is" without express or implied warranty.
|
||||
*
|
||||
*
|
||||
* Copyright (c) 1996,1997
|
||||
* Silicon Graphics Computer Systems, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, distribute and sell this software
|
||||
* and its documentation for any purpose is hereby granted without fee,
|
||||
* provided that the above copyright notice appear in all copies and
|
||||
* that both that copyright notice and this permission notice appear
|
||||
* in supporting documentation. Silicon Graphics makes no
|
||||
* representations about the suitability of this software for any
|
||||
* purpose. It is provided "as is" without express or implied warranty.
|
||||
*/
|
||||
|
||||
#ifndef _BACKWARD_MULTISET_H
|
||||
#define _BACKWARD_MULTISET_H 1
|
||||
|
||||
#include "backward_warning.h"
|
||||
#include "tree.h"
|
||||
#include <set>
|
||||
|
||||
using std::multiset;
|
||||
|
||||
#endif /* _BACKWARD_MULTISET_H */
|
||||
|
||||
// Local Variables:
|
||||
// mode:C++
|
||||
// End:
|
||||
@ -0,0 +1,42 @@
|
||||
// -*- C++ -*- forwarding header.
|
||||
// Copyright (C) 2000 Free Software Foundation
|
||||
|
||||
// This file is part of GCC.
|
||||
//
|
||||
// GCC is free software; you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation; either version 2, or (at your option)
|
||||
// any later version.
|
||||
//
|
||||
// GCC is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with GCC; see the file COPYING. If not, write to
|
||||
// the Free Software Foundation, 59 Temple Place - Suite 330,
|
||||
// Boston, MA 02111-1307, USA.
|
||||
|
||||
// As a special exception, you may use this file as part of a free software
|
||||
// library without restriction. Specifically, if other files instantiate
|
||||
// templates or use macros or inline functions from this file, or you compile
|
||||
// this file and link it with other files to produce an executable, this
|
||||
// file does not by itself cause the resulting executable to be covered by
|
||||
// the GNU General Public License. This exception does not however
|
||||
// invalidate any other reasons why the executable file might be covered by
|
||||
// the GNU General Public License.
|
||||
|
||||
#ifndef _BACKWARD_NEW_H
|
||||
#define _BACKWARD_NEW_H 1
|
||||
|
||||
#include "backward_warning.h"
|
||||
#include <new>
|
||||
|
||||
using std::bad_alloc;
|
||||
using std::nothrow_t;
|
||||
using std::nothrow;
|
||||
using std::new_handler;
|
||||
using std::set_new_handler;
|
||||
|
||||
#endif
|
||||
@ -0,0 +1,38 @@
|
||||
// Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 2, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING. If not, write to the Free
|
||||
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
// USA.
|
||||
|
||||
// As a special exception, you may use this file as part of a free software
|
||||
// library without restriction. Specifically, if other files instantiate
|
||||
// templates or use macros or inline functions from this file, or you compile
|
||||
// this file and link it with other files to produce an executable, this
|
||||
// file does not by itself cause the resulting executable to be covered by
|
||||
// the GNU General Public License. This exception does not however
|
||||
// invalidate any other reasons why the executable file might be covered by
|
||||
// the GNU General Public License.
|
||||
|
||||
#ifndef _BACKWARD_OSTREAM_H
|
||||
#define _BACKWARD_OSTREAM_H 1
|
||||
|
||||
#include "backward_warning.h"
|
||||
#include "iostream.h"
|
||||
|
||||
#endif
|
||||
|
||||
// Local Variables:
|
||||
// mode:C++
|
||||
// End:
|
||||
@ -0,0 +1,70 @@
|
||||
// Backward-compat support -*- C++ -*-
|
||||
|
||||
// Copyright (C) 2001 Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 2, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING. If not, write to the Free
|
||||
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
// USA.
|
||||
|
||||
// As a special exception, you may use this file as part of a free software
|
||||
// library without restriction. Specifically, if other files instantiate
|
||||
// templates or use macros or inline functions from this file, or you compile
|
||||
// this file and link it with other files to produce an executable, this
|
||||
// file does not by itself cause the resulting executable to be covered by
|
||||
// the GNU General Public License. This exception does not however
|
||||
// invalidate any other reasons why the executable file might be covered by
|
||||
// the GNU General Public License.
|
||||
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 1994
|
||||
* Hewlett-Packard Company
|
||||
*
|
||||
* Permission to use, copy, modify, distribute and sell this software
|
||||
* and its documentation for any purpose is hereby granted without fee,
|
||||
* provided that the above copyright notice appear in all copies and
|
||||
* that both that copyright notice and this permission notice appear
|
||||
* in supporting documentation. Hewlett-Packard Company makes no
|
||||
* representations about the suitability of this software for any
|
||||
* purpose. It is provided "as is" without express or implied warranty.
|
||||
*
|
||||
*
|
||||
* Copyright (c) 1996,1997
|
||||
* Silicon Graphics Computer Systems, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, distribute and sell this software
|
||||
* and its documentation for any purpose is hereby granted without fee,
|
||||
* provided that the above copyright notice appear in all copies and
|
||||
* that both that copyright notice and this permission notice appear
|
||||
* in supporting documentation. Silicon Graphics makes no
|
||||
* representations about the suitability of this software for any
|
||||
* purpose. It is provided "as is" without express or implied warranty.
|
||||
*/
|
||||
|
||||
#ifndef _BACKWARD_PAIR_H
|
||||
#define _BACKWARD_PAIR_H 1
|
||||
|
||||
#include "backward_warning.h"
|
||||
#include <bits/c++config.h>
|
||||
#include <bits/stl_pair.h>
|
||||
|
||||
using std::pair;
|
||||
using std::make_pair;
|
||||
|
||||
#endif /* _BACKWARD_PAIR_H */
|
||||
|
||||
// Local Variables:
|
||||
// mode:C++
|
||||
// End:
|
||||
@ -0,0 +1,41 @@
|
||||
// Copyright (C) 2001 Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 2, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING. If not, write to the Free
|
||||
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
// USA.
|
||||
|
||||
// As a special exception, you may use this file as part of a free software
|
||||
// library without restriction. Specifically, if other files instantiate
|
||||
// templates or use macros or inline functions from this file, or you compile
|
||||
// this file and link it with other files to produce an executable, this
|
||||
// file does not by itself cause the resulting executable to be covered by
|
||||
// the GNU General Public License. This exception does not however
|
||||
// invalidate any other reasons why the executable file might be covered by
|
||||
// the GNU General Public License.
|
||||
|
||||
#ifndef _BACKWARD_QUEUE_H
|
||||
#define _BACKWARD_QUEUE_H 1
|
||||
|
||||
#include "backward_warning.h"
|
||||
#include <queue>
|
||||
|
||||
using std::queue;
|
||||
using std::priority_queue;
|
||||
|
||||
#endif
|
||||
|
||||
// Local Variables:
|
||||
// mode:C++
|
||||
// End:
|
||||
@ -0,0 +1,60 @@
|
||||
// Backward-compat support -*- C++ -*-
|
||||
|
||||
// Copyright (C) 2001 Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 2, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING. If not, write to the Free
|
||||
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
// USA.
|
||||
|
||||
// As a special exception, you may use this file as part of a free software
|
||||
// library without restriction. Specifically, if other files instantiate
|
||||
// templates or use macros or inline functions from this file, or you compile
|
||||
// this file and link it with other files to produce an executable, this
|
||||
// file does not by itself cause the resulting executable to be covered by
|
||||
// the GNU General Public License. This exception does not however
|
||||
// invalidate any other reasons why the executable file might be covered by
|
||||
// the GNU General Public License.
|
||||
|
||||
/*
|
||||
* Copyright (c) 1997
|
||||
* Silicon Graphics Computer Systems, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, distribute and sell this software
|
||||
* and its documentation for any purpose is hereby granted without fee,
|
||||
* provided that the above copyright notice appear in all copies and
|
||||
* that both that copyright notice and this permission notice appear
|
||||
* in supporting documentation. Silicon Graphics makes no
|
||||
* representations about the suitability of this software for any
|
||||
* purpose. It is provided "as is" without express or implied warranty.
|
||||
*/
|
||||
|
||||
#ifndef _BACKWARD_ROPE_H
|
||||
#define _BACKWARD_ROPE_H 1
|
||||
|
||||
#include "backward_warning.h"
|
||||
#include "hashtable.h"
|
||||
#include <ext/rope>
|
||||
|
||||
using __gnu_cxx::char_producer;
|
||||
using __gnu_cxx::sequence_buffer;
|
||||
using __gnu_cxx::rope;
|
||||
using __gnu_cxx::crope;
|
||||
using __gnu_cxx::wrope;
|
||||
|
||||
#endif /* _BACKWARD_ROPE_H */
|
||||
|
||||
// Local Variables:
|
||||
// mode:C++
|
||||
// End:
|
||||
@ -0,0 +1,69 @@
|
||||
// Backward-compat support -*- C++ -*-
|
||||
|
||||
// Copyright (C) 2001 Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 2, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING. If not, write to the Free
|
||||
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
// USA.
|
||||
|
||||
// As a special exception, you may use this file as part of a free software
|
||||
// library without restriction. Specifically, if other files instantiate
|
||||
// templates or use macros or inline functions from this file, or you compile
|
||||
// this file and link it with other files to produce an executable, this
|
||||
// file does not by itself cause the resulting executable to be covered by
|
||||
// the GNU General Public License. This exception does not however
|
||||
// invalidate any other reasons why the executable file might be covered by
|
||||
// the GNU General Public License.
|
||||
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 1994
|
||||
* Hewlett-Packard Company
|
||||
*
|
||||
* Permission to use, copy, modify, distribute and sell this software
|
||||
* and its documentation for any purpose is hereby granted without fee,
|
||||
* provided that the above copyright notice appear in all copies and
|
||||
* that both that copyright notice and this permission notice appear
|
||||
* in supporting documentation. Hewlett-Packard Company makes no
|
||||
* representations about the suitability of this software for any
|
||||
* purpose. It is provided "as is" without express or implied warranty.
|
||||
*
|
||||
*
|
||||
* Copyright (c) 1996,1997
|
||||
* Silicon Graphics Computer Systems, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, distribute and sell this software
|
||||
* and its documentation for any purpose is hereby granted without fee,
|
||||
* provided that the above copyright notice appear in all copies and
|
||||
* that both that copyright notice and this permission notice appear
|
||||
* in supporting documentation. Silicon Graphics makes no
|
||||
* representations about the suitability of this software for any
|
||||
* purpose. It is provided "as is" without express or implied warranty.
|
||||
*/
|
||||
|
||||
#ifndef _BACKWARD_SET_H
|
||||
#define _BACKWARD_SET_H 1
|
||||
|
||||
#include "backward_warning.h"
|
||||
#include "tree.h"
|
||||
#include <set>
|
||||
|
||||
using std::set;
|
||||
|
||||
#endif /* _BACKWARD_SET_H */
|
||||
|
||||
// Local Variables:
|
||||
// mode:C++
|
||||
// End:
|
||||
@ -0,0 +1,56 @@
|
||||
// Backward-compat support -*- C++ -*-
|
||||
|
||||
// Copyright (C) 2001 Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 2, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING. If not, write to the Free
|
||||
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
// USA.
|
||||
|
||||
// As a special exception, you may use this file as part of a free software
|
||||
// library without restriction. Specifically, if other files instantiate
|
||||
// templates or use macros or inline functions from this file, or you compile
|
||||
// this file and link it with other files to produce an executable, this
|
||||
// file does not by itself cause the resulting executable to be covered by
|
||||
// the GNU General Public License. This exception does not however
|
||||
// invalidate any other reasons why the executable file might be covered by
|
||||
// the GNU General Public License.
|
||||
|
||||
/*
|
||||
* Copyright (c) 1997
|
||||
* Silicon Graphics Computer Systems, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, distribute and sell this software
|
||||
* and its documentation for any purpose is hereby granted without fee,
|
||||
* provided that the above copyright notice appear in all copies and
|
||||
* that both that copyright notice and this permission notice appear
|
||||
* in supporting documentation. Silicon Graphics makes no
|
||||
* representations about the suitability of this software for any
|
||||
* purpose. It is provided "as is" without express or implied warranty.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _BACKWARD_SLIST_H
|
||||
#define _BACKWARD_SLIST_H 1
|
||||
|
||||
#include "backward_warning.h"
|
||||
#include <ext/slist>
|
||||
|
||||
using __gnu_cxx::slist;
|
||||
|
||||
#endif /* _BACKWARD_SLIST_H */
|
||||
|
||||
// Local Variables:
|
||||
// mode:C++
|
||||
// End:
|
||||
@ -0,0 +1,72 @@
|
||||
// Backward-compat support -*- C++ -*-
|
||||
|
||||
// Copyright (C) 2001 Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 2, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING. If not, write to the Free
|
||||
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
// USA.
|
||||
|
||||
// As a special exception, you may use this file as part of a free software
|
||||
// library without restriction. Specifically, if other files instantiate
|
||||
// templates or use macros or inline functions from this file, or you compile
|
||||
// this file and link it with other files to produce an executable, this
|
||||
// file does not by itself cause the resulting executable to be covered by
|
||||
// the GNU General Public License. This exception does not however
|
||||
// invalidate any other reasons why the executable file might be covered by
|
||||
// the GNU General Public License.
|
||||
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 1994
|
||||
* Hewlett-Packard Company
|
||||
*
|
||||
* Permission to use, copy, modify, distribute and sell this software
|
||||
* and its documentation for any purpose is hereby granted without fee,
|
||||
* provided that the above copyright notice appear in all copies and
|
||||
* that both that copyright notice and this permission notice appear
|
||||
* in supporting documentation. Hewlett-Packard Company makes no
|
||||
* representations about the suitability of this software for any
|
||||
* purpose. It is provided "as is" without express or implied warranty.
|
||||
*
|
||||
*
|
||||
* Copyright (c) 1996,1997
|
||||
* Silicon Graphics Computer Systems, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, distribute and sell this software
|
||||
* and its documentation for any purpose is hereby granted without fee,
|
||||
* provided that the above copyright notice appear in all copies and
|
||||
* that both that copyright notice and this permission notice appear
|
||||
* in supporting documentation. Silicon Graphics makes no
|
||||
* representations about the suitability of this software for any
|
||||
* purpose. It is provided "as is" without express or implied warranty.
|
||||
*/
|
||||
|
||||
#ifndef _BACKWARD_STACK_H
|
||||
#define _BACKWARD_STACK_H 1
|
||||
|
||||
#include "backward_warning.h"
|
||||
#include "vector.h"
|
||||
#include "deque.h"
|
||||
#include "heap.h"
|
||||
#include "queue.h"
|
||||
#include <stack>
|
||||
|
||||
using std::stack;
|
||||
|
||||
#endif /* _BACKWARD_STACK_H */
|
||||
|
||||
// Local Variables:
|
||||
// mode:C++
|
||||
// End:
|
||||
@ -0,0 +1,38 @@
|
||||
// Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 2, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING. If not, write to the Free
|
||||
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
// USA.
|
||||
|
||||
// As a special exception, you may use this file as part of a free software
|
||||
// library without restriction. Specifically, if other files instantiate
|
||||
// templates or use macros or inline functions from this file, or you compile
|
||||
// this file and link it with other files to produce an executable, this
|
||||
// file does not by itself cause the resulting executable to be covered by
|
||||
// the GNU General Public License. This exception does not however
|
||||
// invalidate any other reasons why the executable file might be covered by
|
||||
// the GNU General Public License.
|
||||
|
||||
#ifndef _BACKWARD_STREAM_H
|
||||
#define _BACKWARD_STREAM_H 1
|
||||
|
||||
#include "backward_warning.h"
|
||||
#include "iostream.h"
|
||||
|
||||
#endif
|
||||
|
||||
// Local Variables:
|
||||
// mode:C++
|
||||
// End:
|
||||
@ -0,0 +1,40 @@
|
||||
// Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 2, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING. If not, write to the Free
|
||||
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
// USA.
|
||||
|
||||
// As a special exception, you may use this file as part of a free software
|
||||
// library without restriction. Specifically, if other files instantiate
|
||||
// templates or use macros or inline functions from this file, or you compile
|
||||
// this file and link it with other files to produce an executable, this
|
||||
// file does not by itself cause the resulting executable to be covered by
|
||||
// the GNU General Public License. This exception does not however
|
||||
// invalidate any other reasons why the executable file might be covered by
|
||||
// the GNU General Public License.
|
||||
|
||||
#ifndef _BACKWARD_STREAMBUF_H
|
||||
#define _BACKWARD_STREAMBUF_H 1
|
||||
|
||||
#include "backward_warning.h"
|
||||
#include <streambuf>
|
||||
|
||||
using std::streambuf;
|
||||
|
||||
#endif
|
||||
|
||||
// Local Variables:
|
||||
// mode:C++
|
||||
// End:
|
||||
@ -0,0 +1,174 @@
|
||||
// Backward-compat support -*- C++ -*-
|
||||
|
||||
// Copyright (C) 2001, 2002 Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 2, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING. If not, write to the Free
|
||||
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
// USA.
|
||||
|
||||
// As a special exception, you may use this file as part of a free software
|
||||
// library without restriction. Specifically, if other files instantiate
|
||||
// templates or use macros or inline functions from this file, or you compile
|
||||
// this file and link it with other files to produce an executable, this
|
||||
// file does not by itself cause the resulting executable to be covered by
|
||||
// the GNU General Public License. This exception does not however
|
||||
// invalidate any other reasons why the executable file might be covered by
|
||||
// the GNU General Public License.
|
||||
|
||||
/*
|
||||
* Copyright (c) 1998
|
||||
* Silicon Graphics Computer Systems, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, distribute and sell this software
|
||||
* and its documentation for any purpose is hereby granted without fee,
|
||||
* provided that the above copyright notice appear in all copies and
|
||||
* that both that copyright notice and this permission notice appear
|
||||
* in supporting documentation. Silicon Graphics makes no
|
||||
* representations about the suitability of this software for any
|
||||
* purpose. It is provided "as is" without express or implied warranty.
|
||||
*/
|
||||
|
||||
// WARNING: The classes defined in this header are DEPRECATED. This
|
||||
// header is defined in section D.7.1 of the C++ standard, and it
|
||||
// MAY BE REMOVED in a future standard revision. You should use the
|
||||
// header <sstream> instead.
|
||||
|
||||
#ifndef __SGI_STL_STRSTREAM
|
||||
#define __SGI_STL_STRSTREAM
|
||||
|
||||
#include "backward_warning.h"
|
||||
#include <iosfwd>
|
||||
#include <ios>
|
||||
#include <istream>
|
||||
#include <ostream>
|
||||
#include <string>
|
||||
|
||||
namespace std
|
||||
{
|
||||
// Class strstreambuf, a streambuf class that manages an array of char.
|
||||
// Note that this class is not a template.
|
||||
class strstreambuf : public basic_streambuf<char, char_traits<char> >
|
||||
{
|
||||
public:
|
||||
// Types.
|
||||
typedef char_traits<char> _Traits;
|
||||
typedef basic_streambuf<char, _Traits> _Base;
|
||||
|
||||
public:
|
||||
// Constructor, destructor
|
||||
explicit strstreambuf(streamsize __initial_capacity = 0);
|
||||
strstreambuf(void* (*__alloc)(size_t), void (*__free)(void*));
|
||||
|
||||
strstreambuf(char* __get, streamsize __n, char* __put = 0);
|
||||
strstreambuf(signed char* __get, streamsize __n, signed char* __put = 0);
|
||||
strstreambuf(unsigned char* __get, streamsize __n, unsigned char* __put=0);
|
||||
|
||||
strstreambuf(const char* __get, streamsize __n);
|
||||
strstreambuf(const signed char* __get, streamsize __n);
|
||||
strstreambuf(const unsigned char* __get, streamsize __n);
|
||||
|
||||
virtual ~strstreambuf();
|
||||
|
||||
public:
|
||||
void freeze(bool = true);
|
||||
char* str();
|
||||
int pcount() const;
|
||||
|
||||
protected:
|
||||
virtual int_type overflow(int_type __c = _Traits::eof());
|
||||
virtual int_type pbackfail(int_type __c = _Traits::eof());
|
||||
virtual int_type underflow();
|
||||
virtual _Base* setbuf(char* __buf, streamsize __n);
|
||||
virtual pos_type seekoff(off_type __off, ios_base::seekdir __dir,
|
||||
ios_base::openmode __mode
|
||||
= ios_base::in | ios_base::out);
|
||||
virtual pos_type seekpos(pos_type __pos, ios_base::openmode __mode
|
||||
= ios_base::in | ios_base::out);
|
||||
|
||||
private:
|
||||
// Dynamic allocation, possibly using _M_alloc_fun and _M_free_fun.
|
||||
char* _M_alloc(size_t);
|
||||
void _M_free(char*);
|
||||
|
||||
// Helper function used in constructors.
|
||||
void _M_setup(char* __get, char* __put, streamsize __n);
|
||||
|
||||
private:
|
||||
// Data members.
|
||||
void* (*_M_alloc_fun)(size_t);
|
||||
void (*_M_free_fun)(void*);
|
||||
|
||||
bool _M_dynamic : 1;
|
||||
bool _M_frozen : 1;
|
||||
bool _M_constant : 1;
|
||||
};
|
||||
|
||||
// Class istrstream, an istream that manages a strstreambuf.
|
||||
class istrstream : public basic_istream<char>
|
||||
{
|
||||
public:
|
||||
explicit istrstream(char*);
|
||||
explicit istrstream(const char*);
|
||||
istrstream(char* , streamsize);
|
||||
istrstream(const char*, streamsize);
|
||||
virtual ~istrstream();
|
||||
|
||||
strstreambuf* rdbuf() const;
|
||||
char* str();
|
||||
|
||||
private:
|
||||
strstreambuf _M_buf;
|
||||
};
|
||||
|
||||
// Class ostrstream
|
||||
class ostrstream : public basic_ostream<char>
|
||||
{
|
||||
public:
|
||||
ostrstream();
|
||||
ostrstream(char*, int, ios_base::openmode = ios_base::out);
|
||||
virtual ~ostrstream();
|
||||
|
||||
strstreambuf* rdbuf() const;
|
||||
void freeze(bool = true);
|
||||
char* str();
|
||||
int pcount() const;
|
||||
|
||||
private:
|
||||
strstreambuf _M_buf;
|
||||
};
|
||||
|
||||
// Class strstream
|
||||
class strstream : public basic_iostream<char>
|
||||
{
|
||||
public:
|
||||
typedef char char_type;
|
||||
typedef char_traits<char>::int_type int_type;
|
||||
typedef char_traits<char>::pos_type pos_type;
|
||||
typedef char_traits<char>::off_type off_type;
|
||||
|
||||
strstream();
|
||||
strstream(char*, int, ios_base::openmode = ios_base::in | ios_base::out);
|
||||
virtual ~strstream();
|
||||
|
||||
strstreambuf* rdbuf() const;
|
||||
void freeze(bool = true);
|
||||
int pcount() const;
|
||||
char* str();
|
||||
|
||||
private:
|
||||
strstreambuf _M_buf;
|
||||
};
|
||||
} // namespace std
|
||||
#endif
|
||||
@ -0,0 +1,78 @@
|
||||
// Backward-compat support -*- C++ -*-
|
||||
|
||||
// Copyright (C) 2001 Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 2, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING. If not, write to the Free
|
||||
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
// USA.
|
||||
|
||||
// As a special exception, you may use this file as part of a free software
|
||||
// library without restriction. Specifically, if other files instantiate
|
||||
// templates or use macros or inline functions from this file, or you compile
|
||||
// this file and link it with other files to produce an executable, this
|
||||
// file does not by itself cause the resulting executable to be covered by
|
||||
// the GNU General Public License. This exception does not however
|
||||
// invalidate any other reasons why the executable file might be covered by
|
||||
// the GNU General Public License.
|
||||
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 1994
|
||||
* Hewlett-Packard Company
|
||||
*
|
||||
* Permission to use, copy, modify, distribute and sell this software
|
||||
* and its documentation for any purpose is hereby granted without fee,
|
||||
* provided that the above copyright notice appear in all copies and
|
||||
* that both that copyright notice and this permission notice appear
|
||||
* in supporting documentation. Hewlett-Packard Company makes no
|
||||
* representations about the suitability of this software for any
|
||||
* purpose. It is provided "as is" without express or implied warranty.
|
||||
*
|
||||
*
|
||||
* Copyright (c) 1996
|
||||
* Silicon Graphics Computer Systems, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, distribute and sell this software
|
||||
* and its documentation for any purpose is hereby granted without fee,
|
||||
* provided that the above copyright notice appear in all copies and
|
||||
* that both that copyright notice and this permission notice appear
|
||||
* in supporting documentation. Silicon Graphics makes no
|
||||
* representations about the suitability of this software for any
|
||||
* purpose. It is provided "as is" without express or implied warranty.
|
||||
*/
|
||||
|
||||
#ifndef _BACKWARD_TEMPBUF_H
|
||||
#define _BACKWARD_TEMPBUF_H 1
|
||||
|
||||
#include "backward_warning.h"
|
||||
#include "pair.h"
|
||||
#include "iterator.h"
|
||||
#include <limits.h>
|
||||
#include <stddef.h>
|
||||
#include <stdlib.h>
|
||||
#include <bits/type_traits.h>
|
||||
#include <bits/stl_construct.h>
|
||||
#include <bits/stl_uninitialized.h>
|
||||
#include <ext/memory>
|
||||
|
||||
using std::get_temporary_buffer;
|
||||
using std::return_temporary_buffer;
|
||||
using __gnu_cxx::temporary_buffer;
|
||||
|
||||
#endif /* _BACKWARD_TEMPBUF_H */
|
||||
|
||||
// Local Variables:
|
||||
// mode:C++
|
||||
// End:
|
||||
@ -0,0 +1,55 @@
|
||||
// Backward-compat support -*- C++ -*-
|
||||
|
||||
// Copyright (C) 2001 Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 2, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING. If not, write to the Free
|
||||
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
// USA.
|
||||
|
||||
// As a special exception, you may use this file as part of a free software
|
||||
// library without restriction. Specifically, if other files instantiate
|
||||
// templates or use macros or inline functions from this file, or you compile
|
||||
// this file and link it with other files to produce an executable, this
|
||||
// file does not by itself cause the resulting executable to be covered by
|
||||
// the GNU General Public License. This exception does not however
|
||||
// invalidate any other reasons why the executable file might be covered by
|
||||
// the GNU General Public License.
|
||||
|
||||
/*
|
||||
* Copyright (c) 1997
|
||||
* Silicon Graphics Computer Systems, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, distribute and sell this software
|
||||
* and its documentation for any purpose is hereby granted without fee,
|
||||
* provided that the above copyright notice appear in all copies and
|
||||
* that both that copyright notice and this permission notice appear
|
||||
* in supporting documentation. Silicon Graphics makes no
|
||||
* representations about the suitability of this software for any
|
||||
* purpose. It is provided "as is" without express or implied warranty.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _BACKWARD_TREE
|
||||
#define _BACKWARD_TREE 1
|
||||
|
||||
#include "backward_warning.h"
|
||||
#include <ext/rb_tree>
|
||||
|
||||
using __gnu_cxx::rb_tree;
|
||||
|
||||
#endif
|
||||
// Local Variables:
|
||||
// mode:C++
|
||||
// End:
|
||||
@ -0,0 +1,70 @@
|
||||
// Backward-compat support -*- C++ -*-
|
||||
|
||||
// Copyright (C) 2001 Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 2, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING. If not, write to the Free
|
||||
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
// USA.
|
||||
|
||||
// As a special exception, you may use this file as part of a free software
|
||||
// library without restriction. Specifically, if other files instantiate
|
||||
// templates or use macros or inline functions from this file, or you compile
|
||||
// this file and link it with other files to produce an executable, this
|
||||
// file does not by itself cause the resulting executable to be covered by
|
||||
// the GNU General Public License. This exception does not however
|
||||
// invalidate any other reasons why the executable file might be covered by
|
||||
// the GNU General Public License.
|
||||
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 1994
|
||||
* Hewlett-Packard Company
|
||||
*
|
||||
* Permission to use, copy, modify, distribute and sell this software
|
||||
* and its documentation for any purpose is hereby granted without fee,
|
||||
* provided that the above copyright notice appear in all copies and
|
||||
* that both that copyright notice and this permission notice appear
|
||||
* in supporting documentation. Hewlett-Packard Company makes no
|
||||
* representations about the suitability of this software for any
|
||||
* purpose. It is provided "as is" without express or implied warranty.
|
||||
*
|
||||
*
|
||||
* Copyright (c) 1996
|
||||
* Silicon Graphics Computer Systems, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, distribute and sell this software
|
||||
* and its documentation for any purpose is hereby granted without fee,
|
||||
* provided that the above copyright notice appear in all copies and
|
||||
* that both that copyright notice and this permission notice appear
|
||||
* in supporting documentation. Silicon Graphics makes no
|
||||
* representations about the suitability of this software for any
|
||||
* purpose. It is provided "as is" without express or implied warranty.
|
||||
*/
|
||||
|
||||
#ifndef _BACKWARD_VECTOR_H
|
||||
#define _BACKWARD_VECTOR_H 1
|
||||
|
||||
#include "backward_warning.h"
|
||||
#include "algobase.h"
|
||||
#include "alloc.h"
|
||||
#include <vector>
|
||||
|
||||
using std::vector;
|
||||
|
||||
#endif /* _BACKWARD_VECTOR_H */
|
||||
|
||||
// Local Variables:
|
||||
// mode:C++
|
||||
// End:
|
||||
@ -0,0 +1,130 @@
|
||||
// Allocators -*- C++ -*-
|
||||
|
||||
// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 2, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING. If not, write to the Free
|
||||
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
// USA.
|
||||
|
||||
// As a special exception, you may use this file as part of a free software
|
||||
// library without restriction. Specifically, if other files instantiate
|
||||
// templates or use macros or inline functions from this file, or you compile
|
||||
// this file and link it with other files to produce an executable, this
|
||||
// file does not by itself cause the resulting executable to be covered by
|
||||
// the GNU General Public License. This exception does not however
|
||||
// invalidate any other reasons why the executable file might be covered by
|
||||
// the GNU General Public License.
|
||||
|
||||
/*
|
||||
* Copyright (c) 1996-1997
|
||||
* Silicon Graphics Computer Systems, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, distribute and sell this software
|
||||
* and its documentation for any purpose is hereby granted without fee,
|
||||
* provided that the above copyright notice appear in all copies and
|
||||
* that both that copyright notice and this permission notice appear
|
||||
* in supporting documentation. Silicon Graphics makes no
|
||||
* representations about the suitability of this software for any
|
||||
* purpose. It is provided "as is" without express or implied warranty.
|
||||
*/
|
||||
|
||||
/** @file allocator.h
|
||||
* This is an internal header file, included by other library headers.
|
||||
* You should not attempt to use it directly.
|
||||
*/
|
||||
|
||||
#ifndef _ALLOCATOR_H
|
||||
#define _ALLOCATOR_H 1
|
||||
|
||||
// Define the base class to std::allocator.
|
||||
#include <bits/c++allocator.h>
|
||||
|
||||
namespace std
|
||||
{
|
||||
template<typename _Tp>
|
||||
class allocator;
|
||||
|
||||
template<>
|
||||
class allocator<void>
|
||||
{
|
||||
public:
|
||||
typedef size_t size_type;
|
||||
typedef ptrdiff_t difference_type;
|
||||
typedef void* pointer;
|
||||
typedef const void* const_pointer;
|
||||
typedef void value_type;
|
||||
|
||||
template<typename _Tp1>
|
||||
struct rebind
|
||||
{ typedef allocator<_Tp1> other; };
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief The "standard" allocator, as per [20.4].
|
||||
*
|
||||
* (See @link Allocators allocators info @endlink for more.)
|
||||
*/
|
||||
template<typename _Tp>
|
||||
class allocator: public ___glibcxx_base_allocator<_Tp>
|
||||
{
|
||||
public:
|
||||
typedef size_t size_type;
|
||||
typedef ptrdiff_t difference_type;
|
||||
typedef _Tp* pointer;
|
||||
typedef const _Tp* const_pointer;
|
||||
typedef _Tp& reference;
|
||||
typedef const _Tp& const_reference;
|
||||
typedef _Tp value_type;
|
||||
|
||||
template<typename _Tp1>
|
||||
struct rebind
|
||||
{ typedef allocator<_Tp1> other; };
|
||||
|
||||
allocator() throw() { }
|
||||
|
||||
allocator(const allocator& a) throw()
|
||||
: ___glibcxx_base_allocator<_Tp>(a) { }
|
||||
|
||||
template<typename _Tp1>
|
||||
allocator(const allocator<_Tp1>&) throw() { }
|
||||
|
||||
~allocator() throw() { }
|
||||
|
||||
// Inherit everything else.
|
||||
};
|
||||
|
||||
template<typename _T1, typename _T2>
|
||||
inline bool
|
||||
operator==(const allocator<_T1>&, const allocator<_T2>&)
|
||||
{ return true; }
|
||||
|
||||
template<typename _T1, typename _T2>
|
||||
inline bool
|
||||
operator!=(const allocator<_T1>&, const allocator<_T2>&)
|
||||
{ return false; }
|
||||
|
||||
// Inhibit implicit instantiations for required instantiations,
|
||||
// which are defined via explicit instantiations elsewhere.
|
||||
// NB: This syntax is a GNU extension.
|
||||
#if _GLIBCXX_EXTERN_TEMPLATE
|
||||
extern template class allocator<char>;
|
||||
extern template class allocator<wchar_t>;
|
||||
#endif
|
||||
|
||||
// Undefine.
|
||||
#undef ___glibcxx_base_allocator
|
||||
} // namespace std
|
||||
|
||||
#endif
|
||||
@ -0,0 +1,46 @@
|
||||
// Low-level functions for atomic operations -*- C++ -*-
|
||||
|
||||
// Copyright (C) 2004 Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 2, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING. If not, write to the Free
|
||||
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
// USA.
|
||||
|
||||
// As a special exception, you may use this file as part of a free software
|
||||
// library without restriction. Specifically, if other files instantiate
|
||||
// templates or use macros or inline functions from this file, or you compile
|
||||
// this file and link it with other files to produce an executable, this
|
||||
// file does not by itself cause the resulting executable to be covered by
|
||||
// the GNU General Public License. This exception does not however
|
||||
// invalidate any other reasons why the executable file might be covered by
|
||||
// the GNU General Public License.
|
||||
|
||||
#ifndef _GLIBCXX_ATOMICITY_H
|
||||
#define _GLIBCXX_ATOMICITY_H 1
|
||||
|
||||
#include <bits/atomic_word.h>
|
||||
|
||||
namespace __gnu_cxx
|
||||
{
|
||||
_Atomic_word
|
||||
__attribute__ ((__unused__))
|
||||
__exchange_and_add(volatile _Atomic_word* __mem, int __val);
|
||||
|
||||
void
|
||||
__attribute__ ((__unused__))
|
||||
__atomic_add(volatile _Atomic_word* __mem, int __val);
|
||||
} // namespace __gnu_cxx
|
||||
|
||||
#endif
|
||||
@ -0,0 +1,464 @@
|
||||
// Iostreams base classes -*- C++ -*-
|
||||
|
||||
// Copyright (C) 1997, 1998, 1999, 2001, 2002, 2003
|
||||
// Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 2, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING. If not, write to the Free
|
||||
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
// USA.
|
||||
|
||||
// As a special exception, you may use this file as part of a free software
|
||||
// library without restriction. Specifically, if other files instantiate
|
||||
// templates or use macros or inline functions from this file, or you compile
|
||||
// this file and link it with other files to produce an executable, this
|
||||
// file does not by itself cause the resulting executable to be covered by
|
||||
// the GNU General Public License. This exception does not however
|
||||
// invalidate any other reasons why the executable file might be covered by
|
||||
// the GNU General Public License.
|
||||
|
||||
/** @file basic_ios.h
|
||||
* This is an internal header file, included by other library headers.
|
||||
* You should not attempt to use it directly.
|
||||
*/
|
||||
|
||||
#ifndef _BASIC_IOS_H
|
||||
#define _BASIC_IOS_H 1
|
||||
|
||||
#pragma GCC system_header
|
||||
|
||||
#include <bits/streambuf_iterator.h>
|
||||
#include <bits/localefwd.h>
|
||||
#include <bits/locale_classes.h>
|
||||
#include <bits/locale_facets.h>
|
||||
|
||||
namespace std
|
||||
{
|
||||
// 27.4.5 Template class basic_ios
|
||||
/**
|
||||
* @brief Virtual base class for all stream classes.
|
||||
*
|
||||
* Most of the member functions called dispatched on stream objects
|
||||
* (e.g., @c std::cout.foo(bar);) are consolidated in this class.
|
||||
*/
|
||||
template<typename _CharT, typename _Traits>
|
||||
class basic_ios : public ios_base
|
||||
{
|
||||
public:
|
||||
//@{
|
||||
/**
|
||||
* These are standard types. They permit a standardized way of
|
||||
* referring to names of (or names dependant on) the template
|
||||
* parameters, which are specific to the implementation.
|
||||
*/
|
||||
typedef _CharT char_type;
|
||||
typedef typename _Traits::int_type int_type;
|
||||
typedef typename _Traits::pos_type pos_type;
|
||||
typedef typename _Traits::off_type off_type;
|
||||
typedef _Traits traits_type;
|
||||
//@}
|
||||
|
||||
//@{
|
||||
/**
|
||||
* @if maint
|
||||
* These are non-standard types.
|
||||
* @endif
|
||||
*/
|
||||
typedef ctype<_CharT> __ctype_type;
|
||||
typedef num_put<_CharT, ostreambuf_iterator<_CharT, _Traits> >
|
||||
__num_put_type;
|
||||
typedef num_get<_CharT, istreambuf_iterator<_CharT, _Traits> >
|
||||
__num_get_type;
|
||||
//@}
|
||||
|
||||
// Data members:
|
||||
protected:
|
||||
basic_ostream<_CharT, _Traits>* _M_tie;
|
||||
mutable char_type _M_fill;
|
||||
mutable bool _M_fill_init;
|
||||
basic_streambuf<_CharT, _Traits>* _M_streambuf;
|
||||
|
||||
// Cached use_facet<ctype>, which is based on the current locale info.
|
||||
const __ctype_type* _M_ctype;
|
||||
// For ostream.
|
||||
const __num_put_type* _M_num_put;
|
||||
// For istream.
|
||||
const __num_get_type* _M_num_get;
|
||||
|
||||
public:
|
||||
//@{
|
||||
/**
|
||||
* @brief The quick-and-easy status check.
|
||||
*
|
||||
* This allows you to write constructs such as
|
||||
* "if (!a_stream) ..." and "while (a_stream) ..."
|
||||
*/
|
||||
operator void*() const
|
||||
{ return this->fail() ? 0 : const_cast<basic_ios*>(this); }
|
||||
|
||||
bool
|
||||
operator!() const
|
||||
{ return this->fail(); }
|
||||
//@}
|
||||
|
||||
/**
|
||||
* @brief Returns the error state of the stream buffer.
|
||||
* @return A bit pattern (well, isn't everything?)
|
||||
*
|
||||
* See std::ios_base::iostate for the possible bit values. Most
|
||||
* users will call one of the interpreting wrappers, e.g., good().
|
||||
*/
|
||||
iostate
|
||||
rdstate() const
|
||||
{ return _M_streambuf_state; }
|
||||
|
||||
/**
|
||||
* @brief [Re]sets the error state.
|
||||
* @param state The new state flag(s) to set.
|
||||
*
|
||||
* See std::ios_base::iostate for the possible bit values. Most
|
||||
* users will not need to pass an argument.
|
||||
*/
|
||||
void
|
||||
clear(iostate __state = goodbit);
|
||||
|
||||
/**
|
||||
* @brief Sets additional flags in the error state.
|
||||
* @param state The additional state flag(s) to set.
|
||||
*
|
||||
* See std::ios_base::iostate for the possible bit values.
|
||||
*/
|
||||
void
|
||||
setstate(iostate __state)
|
||||
{ this->clear(this->rdstate() | __state); }
|
||||
|
||||
// Flip the internal state on for the proper state bits, then re
|
||||
// throws the propagated exception if bit also set in
|
||||
// exceptions().
|
||||
void
|
||||
_M_setstate(iostate __state)
|
||||
{
|
||||
// 27.6.1.2.1 Common requirements.
|
||||
// Turn this on without causing an ios::failure to be thrown.
|
||||
_M_streambuf_state |= __state;
|
||||
if (this->exceptions() & __state)
|
||||
__throw_exception_again;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Fast error checking.
|
||||
* @return True if no error flags are set.
|
||||
*
|
||||
* A wrapper around rdstate.
|
||||
*/
|
||||
bool
|
||||
good() const
|
||||
{ return this->rdstate() == 0; }
|
||||
|
||||
/**
|
||||
* @brief Fast error checking.
|
||||
* @return True if the eofbit is set.
|
||||
*
|
||||
* Note that other iostate flags may also be set.
|
||||
*/
|
||||
bool
|
||||
eof() const
|
||||
{ return (this->rdstate() & eofbit) != 0; }
|
||||
|
||||
/**
|
||||
* @brief Fast error checking.
|
||||
* @return True if either the badbit or the failbit is set.
|
||||
*
|
||||
* Checking the badbit in fail() is historical practice.
|
||||
* Note that other iostate flags may also be set.
|
||||
*/
|
||||
bool
|
||||
fail() const
|
||||
{ return (this->rdstate() & (badbit | failbit)) != 0; }
|
||||
|
||||
/**
|
||||
* @brief Fast error checking.
|
||||
* @return True if the badbit is set.
|
||||
*
|
||||
* Note that other iostate flags may also be set.
|
||||
*/
|
||||
bool
|
||||
bad() const
|
||||
{ return (this->rdstate() & badbit) != 0; }
|
||||
|
||||
/**
|
||||
* @brief Throwing exceptions on errors.
|
||||
* @return The current exceptions mask.
|
||||
*
|
||||
* This changes nothing in the stream. See the one-argument version
|
||||
* of exceptions(iostate) for the meaning of the return value.
|
||||
*/
|
||||
iostate
|
||||
exceptions() const
|
||||
{ return _M_exception; }
|
||||
|
||||
/**
|
||||
* @brief Throwing exceptions on errors.
|
||||
* @param except The new exceptions mask.
|
||||
*
|
||||
* By default, error flags are set silently. You can set an
|
||||
* exceptions mask for each stream; if a bit in the mask becomes set
|
||||
* in the error flags, then an exception of type
|
||||
* std::ios_base::failure is thrown.
|
||||
*
|
||||
* If the error flage is already set when the exceptions mask is
|
||||
* added, the exception is immediately thrown. Try running the
|
||||
* following under GCC 3.1 or later:
|
||||
* @code
|
||||
* #include <iostream>
|
||||
* #include <fstream>
|
||||
* #include <exception>
|
||||
*
|
||||
* int main()
|
||||
* {
|
||||
* std::set_terminate (__gnu_cxx::__verbose_terminate_handler);
|
||||
*
|
||||
* std::ifstream f ("/etc/motd");
|
||||
*
|
||||
* std::cerr << "Setting badbit\n";
|
||||
* f.setstate (std::ios_base::badbit);
|
||||
*
|
||||
* std::cerr << "Setting exception mask\n";
|
||||
* f.exceptions (std::ios_base::badbit);
|
||||
* }
|
||||
* @endcode
|
||||
*/
|
||||
void
|
||||
exceptions(iostate __except)
|
||||
{
|
||||
_M_exception = __except;
|
||||
this->clear(_M_streambuf_state);
|
||||
}
|
||||
|
||||
// Constructor/destructor:
|
||||
/**
|
||||
* @brief Constructor performs initialization.
|
||||
*
|
||||
* The parameter is passed by derived streams.
|
||||
*/
|
||||
explicit
|
||||
basic_ios(basic_streambuf<_CharT, _Traits>* __sb)
|
||||
: ios_base(), _M_ctype(0), _M_num_put(0), _M_num_get(0)
|
||||
{ this->init(__sb); }
|
||||
|
||||
/**
|
||||
* @brief Empty.
|
||||
*
|
||||
* The destructor does nothing. More specifically, it does not
|
||||
* destroy the streambuf held by rdbuf().
|
||||
*/
|
||||
virtual
|
||||
~basic_ios() { }
|
||||
|
||||
// Members:
|
||||
/**
|
||||
* @brief Fetches the current @e tied stream.
|
||||
* @return A pointer to the tied stream, or NULL if the stream is
|
||||
* not tied.
|
||||
*
|
||||
* A stream may be @e tied (or synchronized) to a second output
|
||||
* stream. When this stream performs any I/O, the tied stream is
|
||||
* first flushed. For example, @c std::cin is tied to @c std::cout.
|
||||
*/
|
||||
basic_ostream<_CharT, _Traits>*
|
||||
tie() const
|
||||
{ return _M_tie; }
|
||||
|
||||
/**
|
||||
* @brief Ties this stream to an output stream.
|
||||
* @param tiestr The output stream.
|
||||
* @return The previously tied output stream, or NULL if the stream
|
||||
* was not tied.
|
||||
*
|
||||
* This sets up a new tie; see tie() for more.
|
||||
*/
|
||||
basic_ostream<_CharT, _Traits>*
|
||||
tie(basic_ostream<_CharT, _Traits>* __tiestr)
|
||||
{
|
||||
basic_ostream<_CharT, _Traits>* __old = _M_tie;
|
||||
_M_tie = __tiestr;
|
||||
return __old;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Accessing the underlying buffer.
|
||||
* @return The current stream buffer.
|
||||
*
|
||||
* This does not change the state of the stream.
|
||||
*/
|
||||
basic_streambuf<_CharT, _Traits>*
|
||||
rdbuf() const
|
||||
{ return _M_streambuf; }
|
||||
|
||||
/**
|
||||
* @brief Changing the underlying buffer.
|
||||
* @param sb The new stream buffer.
|
||||
* @return The previous stream buffer.
|
||||
*
|
||||
* Associates a new buffer with the current stream, and clears the
|
||||
* error state.
|
||||
*
|
||||
* Due to historical accidents which the LWG refuses to correct, the
|
||||
* I/O library suffers from a design error: this function is hidden
|
||||
* in derived classes by overrides of the zero-argument @c rdbuf(),
|
||||
* which is non-virtual for hysterical raisins. As a result, you
|
||||
* must use explicit qualifications to access this function via any
|
||||
* derived class. For example:
|
||||
*
|
||||
* @code
|
||||
* std::fstream foo; // or some other derived type
|
||||
* std::streambuf* p = .....;
|
||||
*
|
||||
* foo.ios::rdbuf(p); // ios == basic_ios<char>
|
||||
* @endcode
|
||||
*/
|
||||
basic_streambuf<_CharT, _Traits>*
|
||||
rdbuf(basic_streambuf<_CharT, _Traits>* __sb);
|
||||
|
||||
/**
|
||||
* @brief Copies fields of __rhs into this.
|
||||
* @param __rhs The source values for the copies.
|
||||
* @return Reference to this object.
|
||||
*
|
||||
* All fields of __rhs are copied into this object except that rdbuf()
|
||||
* and rdstate() remain unchanged. All values in the pword and iword
|
||||
* arrays are copied. Before copying, each callback is invoked with
|
||||
* erase_event. After copying, each (new) callback is invoked with
|
||||
* copyfmt_event. The final step is to copy exceptions().
|
||||
*/
|
||||
basic_ios&
|
||||
copyfmt(const basic_ios& __rhs);
|
||||
|
||||
/**
|
||||
* @brief Retreives the "empty" character.
|
||||
* @return The current fill character.
|
||||
*
|
||||
* It defaults to a space (' ') in the current locale.
|
||||
*/
|
||||
char_type
|
||||
fill() const
|
||||
{
|
||||
if (!_M_fill_init)
|
||||
{
|
||||
_M_fill = this->widen(' ');
|
||||
_M_fill_init = true;
|
||||
}
|
||||
return _M_fill;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Sets a new "empty" character.
|
||||
* @param ch The new character.
|
||||
* @return The previous fill character.
|
||||
*
|
||||
* The fill character is used to fill out space when P+ characters
|
||||
* have been requested (e.g., via setw), Q characters are actually
|
||||
* used, and Q<P. It defaults to a space (' ') in the current locale.
|
||||
*/
|
||||
char_type
|
||||
fill(char_type __ch)
|
||||
{
|
||||
char_type __old = this->fill();
|
||||
_M_fill = __ch;
|
||||
return __old;
|
||||
}
|
||||
|
||||
// Locales:
|
||||
/**
|
||||
* @brief Moves to a new locale.
|
||||
* @param loc The new locale.
|
||||
* @return The previous locale.
|
||||
*
|
||||
* Calls @c ios_base::imbue(loc), and if a stream buffer is associated
|
||||
* with this stream, calls that buffer's @c pubimbue(loc).
|
||||
*
|
||||
* Additional l10n notes are at
|
||||
* http://gcc.gnu.org/onlinedocs/libstdc++/22_locale/howto.html
|
||||
*/
|
||||
locale
|
||||
imbue(const locale& __loc);
|
||||
|
||||
/**
|
||||
* @brief Squeezes characters.
|
||||
* @param c The character to narrow.
|
||||
* @param dfault The character to narrow.
|
||||
* @return The narrowed character.
|
||||
*
|
||||
* Maps a character of @c char_type to a character of @c char,
|
||||
* if possible.
|
||||
*
|
||||
* Returns the result of
|
||||
* @code
|
||||
* std::use_facet<ctype<char_type> >(getloc()).narrow(c,dfault)
|
||||
* @endcode
|
||||
*
|
||||
* Additional l10n notes are at
|
||||
* http://gcc.gnu.org/onlinedocs/libstdc++/22_locale/howto.html
|
||||
*/
|
||||
char
|
||||
narrow(char_type __c, char __dfault) const;
|
||||
|
||||
/**
|
||||
* @brief Widens characters.
|
||||
* @param c The character to widen.
|
||||
* @return The widened character.
|
||||
*
|
||||
* Maps a character of @c char to a character of @c char_type.
|
||||
*
|
||||
* Returns the result of
|
||||
* @code
|
||||
* std::use_facet<ctype<char_type> >(getloc()).widen(c)
|
||||
* @endcode
|
||||
*
|
||||
* Additional l10n notes are at
|
||||
* http://gcc.gnu.org/onlinedocs/libstdc++/22_locale/howto.html
|
||||
*/
|
||||
char_type
|
||||
widen(char __c) const;
|
||||
|
||||
protected:
|
||||
// 27.4.5.1 basic_ios constructors
|
||||
/**
|
||||
* @brief Empty.
|
||||
*
|
||||
* The default constructor does nothing and is not normally
|
||||
* accessible to users.
|
||||
*/
|
||||
basic_ios() : ios_base(), _M_ctype(0), _M_num_put(0), _M_num_get(0)
|
||||
{ }
|
||||
|
||||
/**
|
||||
* @brief All setup is performed here.
|
||||
*
|
||||
* This is called from the public constructor. It is not virtual and
|
||||
* cannot be redefined.
|
||||
*/
|
||||
void
|
||||
init(basic_streambuf<_CharT, _Traits>* __sb);
|
||||
|
||||
void
|
||||
_M_cache_locale(const locale& __loc);
|
||||
};
|
||||
} // namespace std
|
||||
|
||||
#ifndef _GLIBCXX_EXPORT_TEMPLATE
|
||||
#include <bits/basic_ios.tcc>
|
||||
#endif
|
||||
|
||||
#endif /* _BASIC_IOS_H */
|
||||
@ -0,0 +1,200 @@
|
||||
// basic_ios member functions -*- C++ -*-
|
||||
|
||||
// Copyright (C) 1999, 2001, 2002, 2003 Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 2, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING. If not, write to the Free
|
||||
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
// USA.
|
||||
|
||||
// As a special exception, you may use this file as part of a free software
|
||||
// library without restriction. Specifically, if other files instantiate
|
||||
// templates or use macros or inline functions from this file, or you compile
|
||||
// this file and link it with other files to produce an executable, this
|
||||
// file does not by itself cause the resulting executable to be covered by
|
||||
// the GNU General Public License. This exception does not however
|
||||
// invalidate any other reasons why the executable file might be covered by
|
||||
// the GNU General Public License.
|
||||
|
||||
#ifndef _BASIC_IOS_TCC
|
||||
#define _BASIC_IOS_TCC 1
|
||||
|
||||
#pragma GCC system_header
|
||||
|
||||
namespace std
|
||||
{
|
||||
template<typename _CharT, typename _Traits>
|
||||
void
|
||||
basic_ios<_CharT, _Traits>::clear(iostate __state)
|
||||
{
|
||||
if (this->rdbuf())
|
||||
_M_streambuf_state = __state;
|
||||
else
|
||||
_M_streambuf_state = __state | badbit;
|
||||
if (this->exceptions() & this->rdstate())
|
||||
__throw_ios_failure(__N("basic_ios::clear"));
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _Traits>
|
||||
basic_streambuf<_CharT, _Traits>*
|
||||
basic_ios<_CharT, _Traits>::rdbuf(basic_streambuf<_CharT, _Traits>* __sb)
|
||||
{
|
||||
basic_streambuf<_CharT, _Traits>* __old = _M_streambuf;
|
||||
_M_streambuf = __sb;
|
||||
this->clear();
|
||||
return __old;
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _Traits>
|
||||
basic_ios<_CharT, _Traits>&
|
||||
basic_ios<_CharT, _Traits>::copyfmt(const basic_ios& __rhs)
|
||||
{
|
||||
// _GLIBCXX_RESOLVE_LIB_DEFECTS
|
||||
// 292. effects of a.copyfmt (a)
|
||||
if (this != &__rhs)
|
||||
{
|
||||
// Per 27.1.1, do not call imbue, yet must trash all caches
|
||||
// associated with imbue()
|
||||
|
||||
// Alloc any new word array first, so if it fails we have "rollback".
|
||||
_Words* __words = (__rhs._M_word_size <= _S_local_word_size) ?
|
||||
_M_local_word : new _Words[__rhs._M_word_size];
|
||||
|
||||
// Bump refs before doing callbacks, for safety.
|
||||
_Callback_list* __cb = __rhs._M_callbacks;
|
||||
if (__cb)
|
||||
__cb->_M_add_reference();
|
||||
_M_call_callbacks(erase_event);
|
||||
if (_M_word != _M_local_word)
|
||||
{
|
||||
delete [] _M_word;
|
||||
_M_word = 0;
|
||||
}
|
||||
_M_dispose_callbacks();
|
||||
|
||||
// NB: Don't want any added during above.
|
||||
_M_callbacks = __cb;
|
||||
for (int __i = 0; __i < __rhs._M_word_size; ++__i)
|
||||
__words[__i] = __rhs._M_word[__i];
|
||||
if (_M_word != _M_local_word)
|
||||
{
|
||||
delete [] _M_word;
|
||||
_M_word = 0;
|
||||
}
|
||||
_M_word = __words;
|
||||
_M_word_size = __rhs._M_word_size;
|
||||
|
||||
this->flags(__rhs.flags());
|
||||
this->width(__rhs.width());
|
||||
this->precision(__rhs.precision());
|
||||
this->tie(__rhs.tie());
|
||||
this->fill(__rhs.fill());
|
||||
_M_ios_locale = __rhs.getloc();
|
||||
_M_cache_locale(_M_ios_locale);
|
||||
|
||||
_M_call_callbacks(copyfmt_event);
|
||||
|
||||
// The next is required to be the last assignment.
|
||||
this->exceptions(__rhs.exceptions());
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _Traits>
|
||||
char
|
||||
basic_ios<_CharT, _Traits>::narrow(char_type __c, char __dfault) const
|
||||
{ return __check_facet(_M_ctype).narrow(__c, __dfault); }
|
||||
|
||||
template<typename _CharT, typename _Traits>
|
||||
_CharT
|
||||
basic_ios<_CharT, _Traits>::widen(char __c) const
|
||||
{ return __check_facet(_M_ctype).widen(__c); }
|
||||
|
||||
// Locales:
|
||||
template<typename _CharT, typename _Traits>
|
||||
locale
|
||||
basic_ios<_CharT, _Traits>::imbue(const locale& __loc)
|
||||
{
|
||||
locale __old(this->getloc());
|
||||
ios_base::imbue(__loc);
|
||||
_M_cache_locale(__loc);
|
||||
if (this->rdbuf() != 0)
|
||||
this->rdbuf()->pubimbue(__loc);
|
||||
return __old;
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _Traits>
|
||||
void
|
||||
basic_ios<_CharT, _Traits>::init(basic_streambuf<_CharT, _Traits>* __sb)
|
||||
{
|
||||
// NB: This may be called more than once on the same object.
|
||||
ios_base::_M_init();
|
||||
|
||||
// Cache locale data and specific facets used by iostreams.
|
||||
_M_cache_locale(_M_ios_locale);
|
||||
|
||||
// NB: The 27.4.4.1 Postconditions Table specifies requirements
|
||||
// after basic_ios::init() has been called. As part of this,
|
||||
// fill() must return widen(' ') any time after init() has been
|
||||
// called, which needs an imbued ctype facet of char_type to
|
||||
// return without throwing an exception. Unfortunately,
|
||||
// ctype<char_type> is not necessarily a required facet, so
|
||||
// streams with char_type != [char, wchar_t] will not have it by
|
||||
// default. Because of this, the correct value for _M_fill is
|
||||
// constructed on the first call of fill(). That way,
|
||||
// unformatted input and output with non-required basic_ios
|
||||
// instantiations is possible even without imbuing the expected
|
||||
// ctype<char_type> facet.
|
||||
_M_fill = _CharT();
|
||||
_M_fill_init = false;
|
||||
|
||||
_M_tie = 0;
|
||||
_M_exception = goodbit;
|
||||
_M_streambuf = __sb;
|
||||
_M_streambuf_state = __sb ? goodbit : badbit;
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _Traits>
|
||||
void
|
||||
basic_ios<_CharT, _Traits>::_M_cache_locale(const locale& __loc)
|
||||
{
|
||||
if (__builtin_expect(has_facet<__ctype_type>(__loc), true))
|
||||
_M_ctype = &use_facet<__ctype_type>(__loc);
|
||||
else
|
||||
_M_ctype = 0;
|
||||
|
||||
if (__builtin_expect(has_facet<__num_put_type>(__loc), true))
|
||||
_M_num_put = &use_facet<__num_put_type>(__loc);
|
||||
else
|
||||
_M_num_put = 0;
|
||||
|
||||
if (__builtin_expect(has_facet<__num_get_type>(__loc), true))
|
||||
_M_num_get = &use_facet<__num_get_type>(__loc);
|
||||
else
|
||||
_M_num_get = 0;
|
||||
}
|
||||
|
||||
// Inhibit implicit instantiations for required instantiations,
|
||||
// which are defined via explicit instantiations elsewhere.
|
||||
// NB: This syntax is a GNU extension.
|
||||
#if _GLIBCXX_EXTERN_TEMPLATE
|
||||
extern template class basic_ios<char>;
|
||||
|
||||
#ifdef _GLIBCXX_USE_WCHAR_T
|
||||
extern template class basic_ios<wchar_t>;
|
||||
#endif
|
||||
#endif
|
||||
} // namespace std
|
||||
|
||||
#endif
|
||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,967 @@
|
||||
// Components for manipulating sequences of characters -*- C++ -*-
|
||||
|
||||
// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
|
||||
// Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 2, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING. If not, write to the Free
|
||||
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
// USA.
|
||||
|
||||
// As a special exception, you may use this file as part of a free software
|
||||
// library without restriction. Specifically, if other files instantiate
|
||||
// templates or use macros or inline functions from this file, or you compile
|
||||
// this file and link it with other files to produce an executable, this
|
||||
// file does not by itself cause the resulting executable to be covered by
|
||||
// the GNU General Public License. This exception does not however
|
||||
// invalidate any other reasons why the executable file might be covered by
|
||||
// the GNU General Public License.
|
||||
|
||||
//
|
||||
// ISO C++ 14882: 21 Strings library
|
||||
//
|
||||
|
||||
// This file is included by <string>. It is not meant to be included
|
||||
// separately.
|
||||
|
||||
// Written by Jason Merrill based upon the specification by Takanori Adachi
|
||||
// in ANSI X3J16/94-0013R2. Rewritten by Nathan Myers to ISO-14882.
|
||||
|
||||
#ifndef _BASIC_STRING_TCC
|
||||
#define _BASIC_STRING_TCC 1
|
||||
|
||||
#pragma GCC system_header
|
||||
|
||||
namespace std
|
||||
{
|
||||
template<typename _Type>
|
||||
inline bool
|
||||
__is_null_pointer(_Type* __ptr)
|
||||
{ return __ptr == 0; }
|
||||
|
||||
template<typename _Type>
|
||||
inline bool
|
||||
__is_null_pointer(_Type)
|
||||
{ return false; }
|
||||
|
||||
template<typename _CharT, typename _Traits, typename _Alloc>
|
||||
const typename basic_string<_CharT, _Traits, _Alloc>::size_type
|
||||
basic_string<_CharT, _Traits, _Alloc>::
|
||||
_Rep::_S_max_size = (((npos - sizeof(_Rep_base))/sizeof(_CharT)) - 1) / 4;
|
||||
|
||||
template<typename _CharT, typename _Traits, typename _Alloc>
|
||||
const _CharT
|
||||
basic_string<_CharT, _Traits, _Alloc>::
|
||||
_Rep::_S_terminal = _CharT();
|
||||
|
||||
template<typename _CharT, typename _Traits, typename _Alloc>
|
||||
const typename basic_string<_CharT, _Traits, _Alloc>::size_type
|
||||
basic_string<_CharT, _Traits, _Alloc>::npos;
|
||||
|
||||
// Linker sets _S_empty_rep_storage to all 0s (one reference, empty string)
|
||||
// at static init time (before static ctors are run).
|
||||
template<typename _CharT, typename _Traits, typename _Alloc>
|
||||
typename basic_string<_CharT, _Traits, _Alloc>::size_type
|
||||
basic_string<_CharT, _Traits, _Alloc>::_Rep::_S_empty_rep_storage[
|
||||
(sizeof(_Rep_base) + sizeof(_CharT) + sizeof(size_type) - 1) /
|
||||
sizeof(size_type)];
|
||||
|
||||
// NB: This is the special case for Input Iterators, used in
|
||||
// istreambuf_iterators, etc.
|
||||
// Input Iterators have a cost structure very different from
|
||||
// pointers, calling for a different coding style.
|
||||
template<typename _CharT, typename _Traits, typename _Alloc>
|
||||
template<typename _InIterator>
|
||||
_CharT*
|
||||
basic_string<_CharT, _Traits, _Alloc>::
|
||||
_S_construct(_InIterator __beg, _InIterator __end, const _Alloc& __a,
|
||||
input_iterator_tag)
|
||||
{
|
||||
if (__beg == __end && __a == _Alloc())
|
||||
return _S_empty_rep()._M_refdata();
|
||||
// Avoid reallocation for common case.
|
||||
_CharT __buf[100];
|
||||
size_type __len = 0;
|
||||
while (__beg != __end && __len < sizeof(__buf) / sizeof(_CharT))
|
||||
{
|
||||
__buf[__len++] = *__beg;
|
||||
++__beg;
|
||||
}
|
||||
_Rep* __r = _Rep::_S_create(__len, size_type(0), __a);
|
||||
traits_type::copy(__r->_M_refdata(), __buf, __len);
|
||||
try
|
||||
{
|
||||
while (__beg != __end)
|
||||
{
|
||||
if (__len == __r->_M_capacity)
|
||||
{
|
||||
// Allocate more space.
|
||||
_Rep* __another = _Rep::_S_create(__len + 1, __len, __a);
|
||||
traits_type::copy(__another->_M_refdata(),
|
||||
__r->_M_refdata(), __len);
|
||||
__r->_M_destroy(__a);
|
||||
__r = __another;
|
||||
}
|
||||
__r->_M_refdata()[__len++] = *__beg;
|
||||
++__beg;
|
||||
}
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
__r->_M_destroy(__a);
|
||||
__throw_exception_again;
|
||||
}
|
||||
__r->_M_length = __len;
|
||||
__r->_M_refdata()[__len] = _Rep::_S_terminal; // grrr.
|
||||
return __r->_M_refdata();
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _Traits, typename _Alloc>
|
||||
template <typename _InIterator>
|
||||
_CharT*
|
||||
basic_string<_CharT, _Traits, _Alloc>::
|
||||
_S_construct(_InIterator __beg, _InIterator __end, const _Alloc& __a,
|
||||
forward_iterator_tag)
|
||||
{
|
||||
if (__beg == __end && __a == _Alloc())
|
||||
return _S_empty_rep()._M_refdata();
|
||||
|
||||
// NB: Not required, but considered best practice.
|
||||
if (__builtin_expect(__is_null_pointer(__beg), 0))
|
||||
__throw_logic_error(__N("basic_string::_S_construct NULL not valid"));
|
||||
|
||||
const size_type __dnew = static_cast<size_type>(std::distance(__beg,
|
||||
__end));
|
||||
// Check for out_of_range and length_error exceptions.
|
||||
_Rep* __r = _Rep::_S_create(__dnew, size_type(0), __a);
|
||||
try
|
||||
{ _S_copy_chars(__r->_M_refdata(), __beg, __end); }
|
||||
catch(...)
|
||||
{
|
||||
__r->_M_destroy(__a);
|
||||
__throw_exception_again;
|
||||
}
|
||||
__r->_M_length = __dnew;
|
||||
__r->_M_refdata()[__dnew] = _Rep::_S_terminal; // grrr.
|
||||
return __r->_M_refdata();
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _Traits, typename _Alloc>
|
||||
_CharT*
|
||||
basic_string<_CharT, _Traits, _Alloc>::
|
||||
_S_construct(size_type __n, _CharT __c, const _Alloc& __a)
|
||||
{
|
||||
if (__n == 0 && __a == _Alloc())
|
||||
return _S_empty_rep()._M_refdata();
|
||||
|
||||
// Check for out_of_range and length_error exceptions.
|
||||
_Rep* __r = _Rep::_S_create(__n, size_type(0), __a);
|
||||
if (__n)
|
||||
traits_type::assign(__r->_M_refdata(), __n, __c);
|
||||
|
||||
__r->_M_length = __n;
|
||||
__r->_M_refdata()[__n] = _Rep::_S_terminal; // grrr
|
||||
return __r->_M_refdata();
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _Traits, typename _Alloc>
|
||||
basic_string<_CharT, _Traits, _Alloc>::
|
||||
basic_string(const basic_string& __str)
|
||||
: _M_dataplus(__str._M_rep()->_M_grab(_Alloc(), __str.get_allocator()),
|
||||
__str.get_allocator())
|
||||
{ }
|
||||
|
||||
template<typename _CharT, typename _Traits, typename _Alloc>
|
||||
basic_string<_CharT, _Traits, _Alloc>::
|
||||
basic_string(const _Alloc& __a)
|
||||
: _M_dataplus(_S_construct(size_type(), _CharT(), __a), __a)
|
||||
{ }
|
||||
|
||||
template<typename _CharT, typename _Traits, typename _Alloc>
|
||||
basic_string<_CharT, _Traits, _Alloc>::
|
||||
basic_string(const basic_string& __str, size_type __pos, size_type __n)
|
||||
: _M_dataplus(_S_construct(__str._M_data()
|
||||
+ __str._M_check(__pos,
|
||||
"basic_string::basic_string"),
|
||||
__str._M_data() + __str._M_limit(__pos, __n)
|
||||
+ __pos, _Alloc()), _Alloc())
|
||||
{ }
|
||||
|
||||
template<typename _CharT, typename _Traits, typename _Alloc>
|
||||
basic_string<_CharT, _Traits, _Alloc>::
|
||||
basic_string(const basic_string& __str, size_type __pos,
|
||||
size_type __n, const _Alloc& __a)
|
||||
: _M_dataplus(_S_construct(__str._M_data()
|
||||
+ __str._M_check(__pos,
|
||||
"basic_string::basic_string"),
|
||||
__str._M_data() + __str._M_limit(__pos, __n)
|
||||
+ __pos, __a), __a)
|
||||
{ }
|
||||
|
||||
// TBD: DPG annotate
|
||||
template<typename _CharT, typename _Traits, typename _Alloc>
|
||||
basic_string<_CharT, _Traits, _Alloc>::
|
||||
basic_string(const _CharT* __s, size_type __n, const _Alloc& __a)
|
||||
: _M_dataplus(_S_construct(__s, __s + __n, __a), __a)
|
||||
{ }
|
||||
|
||||
// TBD: DPG annotate
|
||||
template<typename _CharT, typename _Traits, typename _Alloc>
|
||||
basic_string<_CharT, _Traits, _Alloc>::
|
||||
basic_string(const _CharT* __s, const _Alloc& __a)
|
||||
: _M_dataplus(_S_construct(__s, __s ? __s + traits_type::length(__s) :
|
||||
__s + npos, __a), __a)
|
||||
{ }
|
||||
|
||||
template<typename _CharT, typename _Traits, typename _Alloc>
|
||||
basic_string<_CharT, _Traits, _Alloc>::
|
||||
basic_string(size_type __n, _CharT __c, const _Alloc& __a)
|
||||
: _M_dataplus(_S_construct(__n, __c, __a), __a)
|
||||
{ }
|
||||
|
||||
// TBD: DPG annotate
|
||||
template<typename _CharT, typename _Traits, typename _Alloc>
|
||||
template<typename _InputIterator>
|
||||
basic_string<_CharT, _Traits, _Alloc>::
|
||||
basic_string(_InputIterator __beg, _InputIterator __end, const _Alloc& __a)
|
||||
: _M_dataplus(_S_construct(__beg, __end, __a), __a)
|
||||
{ }
|
||||
|
||||
template<typename _CharT, typename _Traits, typename _Alloc>
|
||||
basic_string<_CharT, _Traits, _Alloc>&
|
||||
basic_string<_CharT, _Traits, _Alloc>::
|
||||
assign(const basic_string& __str)
|
||||
{
|
||||
if (_M_rep() != __str._M_rep())
|
||||
{
|
||||
// XXX MT
|
||||
const allocator_type __a = this->get_allocator();
|
||||
_CharT* __tmp = __str._M_rep()->_M_grab(__a, __str.get_allocator());
|
||||
_M_rep()->_M_dispose(__a);
|
||||
_M_data(__tmp);
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _Traits, typename _Alloc>
|
||||
basic_string<_CharT, _Traits, _Alloc>&
|
||||
basic_string<_CharT, _Traits, _Alloc>::
|
||||
assign(const _CharT* __s, size_type __n)
|
||||
{
|
||||
__glibcxx_requires_string_len(__s, __n);
|
||||
if (__n > this->max_size())
|
||||
__throw_length_error(__N("basic_string::assign"));
|
||||
if (_M_rep()->_M_is_shared() || less<const _CharT*>()(__s, _M_data())
|
||||
|| less<const _CharT*>()(_M_data() + this->size(), __s))
|
||||
return _M_replace_safe(size_type(0), this->size(), __s, __n);
|
||||
else
|
||||
{
|
||||
// Work in-place
|
||||
const size_type __pos = __s - _M_data();
|
||||
if (__pos >= __n)
|
||||
traits_type::copy(_M_data(), __s, __n);
|
||||
else if (__pos)
|
||||
traits_type::move(_M_data(), __s, __n);
|
||||
_M_rep()->_M_set_sharable();
|
||||
_M_rep()->_M_length = __n;
|
||||
_M_data()[__n] = _Rep::_S_terminal; // grr.
|
||||
return *this;
|
||||
}
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _Traits, typename _Alloc>
|
||||
basic_string<_CharT, _Traits, _Alloc>&
|
||||
basic_string<_CharT, _Traits, _Alloc>::
|
||||
insert(size_type __pos, const _CharT* __s, size_type __n)
|
||||
{
|
||||
__glibcxx_requires_string_len(__s, __n);
|
||||
_M_check(__pos, "basic_string::insert");
|
||||
if (this->max_size() - this->size() < __n)
|
||||
__throw_length_error(__N("basic_string::insert"));
|
||||
if (_M_rep()->_M_is_shared() || less<const _CharT*>()(__s, _M_data())
|
||||
|| less<const _CharT*>()(_M_data() + this->size(), __s))
|
||||
return _M_replace_safe(__pos, size_type(0), __s, __n);
|
||||
else
|
||||
{
|
||||
// Work in-place. If _M_mutate reallocates the string, __s
|
||||
// does not point anymore to valid data, therefore we save its
|
||||
// offset, then we restore it.
|
||||
const size_type __off = __s - _M_data();
|
||||
_M_mutate(__pos, 0, __n);
|
||||
__s = _M_data() + __off;
|
||||
_CharT* __p = _M_data() + __pos;
|
||||
if (__s + __n <= __p)
|
||||
traits_type::copy(__p, __s, __n);
|
||||
else if (__s >= __p)
|
||||
traits_type::copy(__p, __s + __n, __n);
|
||||
else
|
||||
{
|
||||
const size_type __nleft = __p - __s;
|
||||
traits_type::copy(__p, __s, __nleft);
|
||||
traits_type::copy(__p + __nleft, __p + __n, __n - __nleft);
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _Traits, typename _Alloc>
|
||||
basic_string<_CharT, _Traits, _Alloc>&
|
||||
basic_string<_CharT, _Traits, _Alloc>::
|
||||
replace(size_type __pos, size_type __n1, const _CharT* __s,
|
||||
size_type __n2)
|
||||
{
|
||||
__glibcxx_requires_string_len(__s, __n2);
|
||||
_M_check(__pos, "basic_string::replace");
|
||||
__n1 = _M_limit(__pos, __n1);
|
||||
if (this->max_size() - (this->size() - __n1) < __n2)
|
||||
__throw_length_error(__N("basic_string::replace"));
|
||||
bool __left;
|
||||
if (_M_rep()->_M_is_shared() || less<const _CharT*>()(__s, _M_data())
|
||||
|| less<const _CharT*>()(_M_data() + this->size(), __s))
|
||||
return _M_replace_safe(__pos, __n1, __s, __n2);
|
||||
else if ((__left = __s + __n2 <= _M_data() + __pos)
|
||||
|| _M_data() + __pos + __n1 <= __s)
|
||||
{
|
||||
// Work in-place: non-overlapping case.
|
||||
const size_type __off = __s - _M_data();
|
||||
_M_mutate(__pos, __n1, __n2);
|
||||
if (__left)
|
||||
traits_type::copy(_M_data() + __pos,
|
||||
_M_data() + __off, __n2);
|
||||
else
|
||||
traits_type::copy(_M_data() + __pos,
|
||||
_M_data() + __off + __n2 - __n1, __n2);
|
||||
return *this;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Todo: overlapping case.
|
||||
const basic_string __tmp(__s, __n2);
|
||||
return _M_replace_safe(__pos, __n1, __tmp._M_data(), __n2);
|
||||
}
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _Traits, typename _Alloc>
|
||||
void
|
||||
basic_string<_CharT, _Traits, _Alloc>::_Rep::
|
||||
_M_destroy(const _Alloc& __a) throw ()
|
||||
{
|
||||
if (this == &_S_empty_rep())
|
||||
return;
|
||||
const size_type __size = sizeof(_Rep_base) +
|
||||
(this->_M_capacity + 1) * sizeof(_CharT);
|
||||
_Raw_bytes_alloc(__a).deallocate(reinterpret_cast<char*>(this), __size);
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _Traits, typename _Alloc>
|
||||
void
|
||||
basic_string<_CharT, _Traits, _Alloc>::_M_leak_hard()
|
||||
{
|
||||
if (_M_rep() == &_S_empty_rep())
|
||||
return;
|
||||
if (_M_rep()->_M_is_shared())
|
||||
_M_mutate(0, 0, 0);
|
||||
_M_rep()->_M_set_leaked();
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _Traits, typename _Alloc>
|
||||
void
|
||||
basic_string<_CharT, _Traits, _Alloc>::
|
||||
_M_mutate(size_type __pos, size_type __len1, size_type __len2)
|
||||
{
|
||||
const size_type __old_size = this->size();
|
||||
const size_type __new_size = __old_size + __len2 - __len1;
|
||||
const _CharT* __src = _M_data() + __pos + __len1;
|
||||
const size_type __how_much = __old_size - __pos - __len1;
|
||||
|
||||
if (_M_rep() == &_S_empty_rep()
|
||||
|| _M_rep()->_M_is_shared() || __new_size > capacity())
|
||||
{
|
||||
// Must reallocate.
|
||||
const allocator_type __a = get_allocator();
|
||||
_Rep* __r = _Rep::_S_create(__new_size, capacity(), __a);
|
||||
|
||||
if (__pos)
|
||||
traits_type::copy(__r->_M_refdata(), _M_data(), __pos);
|
||||
if (__how_much)
|
||||
traits_type::copy(__r->_M_refdata() + __pos + __len2,
|
||||
__src, __how_much);
|
||||
|
||||
_M_rep()->_M_dispose(__a);
|
||||
_M_data(__r->_M_refdata());
|
||||
}
|
||||
else if (__how_much && __len1 != __len2)
|
||||
{
|
||||
// Work in-place
|
||||
traits_type::move(_M_data() + __pos + __len2, __src, __how_much);
|
||||
}
|
||||
_M_rep()->_M_set_sharable();
|
||||
_M_rep()->_M_length = __new_size;
|
||||
_M_data()[__new_size] = _Rep::_S_terminal; // grrr. (per 21.3.4)
|
||||
// You cannot leave those LWG people alone for a second.
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _Traits, typename _Alloc>
|
||||
void
|
||||
basic_string<_CharT, _Traits, _Alloc>::reserve(size_type __res)
|
||||
{
|
||||
if (__res != this->capacity() || _M_rep()->_M_is_shared())
|
||||
{
|
||||
if (__res > this->max_size())
|
||||
__throw_length_error(__N("basic_string::reserve"));
|
||||
// Make sure we don't shrink below the current size
|
||||
if (__res < this->size())
|
||||
__res = this->size();
|
||||
const allocator_type __a = get_allocator();
|
||||
_CharT* __tmp = _M_rep()->_M_clone(__a, __res - this->size());
|
||||
_M_rep()->_M_dispose(__a);
|
||||
_M_data(__tmp);
|
||||
}
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _Traits, typename _Alloc>
|
||||
void basic_string<_CharT, _Traits, _Alloc>::swap(basic_string& __s)
|
||||
{
|
||||
if (_M_rep()->_M_is_leaked())
|
||||
_M_rep()->_M_set_sharable();
|
||||
if (__s._M_rep()->_M_is_leaked())
|
||||
__s._M_rep()->_M_set_sharable();
|
||||
if (this->get_allocator() == __s.get_allocator())
|
||||
{
|
||||
_CharT* __tmp = _M_data();
|
||||
_M_data(__s._M_data());
|
||||
__s._M_data(__tmp);
|
||||
}
|
||||
// The code below can usually be optimized away.
|
||||
else
|
||||
{
|
||||
const basic_string __tmp1(_M_ibegin(), _M_iend(),
|
||||
__s.get_allocator());
|
||||
const basic_string __tmp2(__s._M_ibegin(), __s._M_iend(),
|
||||
this->get_allocator());
|
||||
*this = __tmp2;
|
||||
__s = __tmp1;
|
||||
}
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _Traits, typename _Alloc>
|
||||
typename basic_string<_CharT, _Traits, _Alloc>::_Rep*
|
||||
basic_string<_CharT, _Traits, _Alloc>::_Rep::
|
||||
_S_create(size_type __capacity, size_type __old_capacity,
|
||||
const _Alloc& __alloc)
|
||||
{
|
||||
typedef basic_string<_CharT, _Traits, _Alloc> __string_type;
|
||||
// _GLIBCXX_RESOLVE_LIB_DEFECTS
|
||||
// 83. String::npos vs. string::max_size()
|
||||
if (__capacity > _S_max_size)
|
||||
__throw_length_error(__N("basic_string::_S_create"));
|
||||
|
||||
// The standard places no restriction on allocating more memory
|
||||
// than is strictly needed within this layer at the moment or as
|
||||
// requested by an explicit application call to reserve().
|
||||
|
||||
// Many malloc implementations perform quite poorly when an
|
||||
// application attempts to allocate memory in a stepwise fashion
|
||||
// growing each allocation size by only 1 char. Additionally,
|
||||
// it makes little sense to allocate less linear memory than the
|
||||
// natural blocking size of the malloc implementation.
|
||||
// Unfortunately, we would need a somewhat low-level calculation
|
||||
// with tuned parameters to get this perfect for any particular
|
||||
// malloc implementation. Fortunately, generalizations about
|
||||
// common features seen among implementations seems to suffice.
|
||||
|
||||
// __pagesize need not match the actual VM page size for good
|
||||
// results in practice, thus we pick a common value on the low
|
||||
// side. __malloc_header_size is an estimate of the amount of
|
||||
// overhead per memory allocation (in practice seen N * sizeof
|
||||
// (void*) where N is 0, 2 or 4). According to folklore,
|
||||
// picking this value on the high side is better than
|
||||
// low-balling it (especially when this algorithm is used with
|
||||
// malloc implementations that allocate memory blocks rounded up
|
||||
// to a size which is a power of 2).
|
||||
const size_type __pagesize = 4096; // must be 2^i * __subpagesize
|
||||
const size_type __subpagesize = 128; // should be >> __malloc_header_size
|
||||
const size_type __malloc_header_size = 4 * sizeof (void*);
|
||||
|
||||
// The below implements an exponential growth policy, necessary to
|
||||
// meet amortized linear time requirements of the library: see
|
||||
// http://gcc.gnu.org/ml/libstdc++/2001-07/msg00085.html.
|
||||
// It's active for allocations requiring an amount of memory above
|
||||
// system pagesize. This is consistent with the requirements of the
|
||||
// standard: http://gcc.gnu.org/ml/libstdc++/2001-07/msg00130.html
|
||||
|
||||
// The biggest string which fits in a memory page
|
||||
const size_type __page_capacity = ((__pagesize - __malloc_header_size
|
||||
- sizeof(_Rep) - sizeof(_CharT))
|
||||
/ sizeof(_CharT));
|
||||
|
||||
if (__capacity > __old_capacity && __capacity < 2 * __old_capacity
|
||||
&& __capacity > __page_capacity)
|
||||
__capacity = 2 * __old_capacity;
|
||||
|
||||
// NB: Need an array of char_type[__capacity], plus a terminating
|
||||
// null char_type() element, plus enough for the _Rep data structure.
|
||||
// Whew. Seemingly so needy, yet so elemental.
|
||||
size_type __size = (__capacity + 1) * sizeof(_CharT) + sizeof(_Rep);
|
||||
|
||||
const size_type __adj_size = __size + __malloc_header_size;
|
||||
if (__adj_size > __pagesize)
|
||||
{
|
||||
const size_type __extra = __pagesize - __adj_size % __pagesize;
|
||||
__capacity += __extra / sizeof(_CharT);
|
||||
// Never allocate a string bigger than _S_max_size.
|
||||
if (__capacity > _S_max_size)
|
||||
__capacity = _S_max_size;
|
||||
__size = (__capacity + 1) * sizeof(_CharT) + sizeof(_Rep);
|
||||
}
|
||||
else if (__size > __subpagesize)
|
||||
{
|
||||
const size_type __extra = __subpagesize - __adj_size % __subpagesize;
|
||||
__capacity += __extra / sizeof(_CharT);
|
||||
__size = (__capacity + 1) * sizeof(_CharT) + sizeof(_Rep);
|
||||
}
|
||||
|
||||
// NB: Might throw, but no worries about a leak, mate: _Rep()
|
||||
// does not throw.
|
||||
void* __place = _Raw_bytes_alloc(__alloc).allocate(__size);
|
||||
_Rep *__p = new (__place) _Rep;
|
||||
__p->_M_capacity = __capacity;
|
||||
__p->_M_set_sharable(); // One reference.
|
||||
__p->_M_length = 0;
|
||||
return __p;
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _Traits, typename _Alloc>
|
||||
_CharT*
|
||||
basic_string<_CharT, _Traits, _Alloc>::_Rep::
|
||||
_M_clone(const _Alloc& __alloc, size_type __res)
|
||||
{
|
||||
// Requested capacity of the clone.
|
||||
const size_type __requested_cap = this->_M_length + __res;
|
||||
_Rep* __r = _Rep::_S_create(__requested_cap, this->_M_capacity,
|
||||
__alloc);
|
||||
if (this->_M_length)
|
||||
traits_type::copy(__r->_M_refdata(), _M_refdata(),
|
||||
this->_M_length);
|
||||
|
||||
__r->_M_length = this->_M_length;
|
||||
__r->_M_refdata()[this->_M_length] = _Rep::_S_terminal;
|
||||
return __r->_M_refdata();
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _Traits, typename _Alloc>
|
||||
void
|
||||
basic_string<_CharT, _Traits, _Alloc>::resize(size_type __n, _CharT __c)
|
||||
{
|
||||
if (__n > max_size())
|
||||
__throw_length_error(__N("basic_string::resize"));
|
||||
const size_type __size = this->size();
|
||||
if (__size < __n)
|
||||
this->append(__n - __size, __c);
|
||||
else if (__n < __size)
|
||||
this->erase(__n);
|
||||
// else nothing (in particular, avoid calling _M_mutate() unnecessarily.)
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _Traits, typename _Alloc>
|
||||
template<typename _InputIterator>
|
||||
basic_string<_CharT, _Traits, _Alloc>&
|
||||
basic_string<_CharT, _Traits, _Alloc>::
|
||||
_M_replace_dispatch(iterator __i1, iterator __i2, _InputIterator __k1,
|
||||
_InputIterator __k2, __false_type)
|
||||
{
|
||||
const basic_string __s(__k1, __k2);
|
||||
const size_type __n1 = __i2 - __i1;
|
||||
if (this->max_size() - (this->size() - __n1) < __s.size())
|
||||
__throw_length_error(__N("basic_string::_M_replace_dispatch"));
|
||||
return _M_replace_safe(__i1 - _M_ibegin(), __n1, __s._M_data(),
|
||||
__s.size());
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _Traits, typename _Alloc>
|
||||
basic_string<_CharT, _Traits, _Alloc>&
|
||||
basic_string<_CharT, _Traits, _Alloc>::
|
||||
append(const basic_string& __str)
|
||||
{
|
||||
// Iff appending itself, string needs to pre-reserve the
|
||||
// correct size so that _M_mutate does not clobber the
|
||||
// pointer __str._M_data() formed here.
|
||||
const size_type __size = __str.size();
|
||||
const size_type __len = __size + this->size();
|
||||
if (__len > this->capacity())
|
||||
this->reserve(__len);
|
||||
return _M_replace_safe(this->size(), size_type(0), __str._M_data(),
|
||||
__str.size());
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _Traits, typename _Alloc>
|
||||
basic_string<_CharT, _Traits, _Alloc>&
|
||||
basic_string<_CharT, _Traits, _Alloc>::
|
||||
append(const basic_string& __str, size_type __pos, size_type __n)
|
||||
{
|
||||
// Iff appending itself, string needs to pre-reserve the
|
||||
// correct size so that _M_mutate does not clobber the
|
||||
// pointer __str._M_data() formed here.
|
||||
__str._M_check(__pos, "basic_string::append");
|
||||
__n = __str._M_limit(__pos, __n);
|
||||
const size_type __len = __n + this->size();
|
||||
if (__len > this->capacity())
|
||||
this->reserve(__len);
|
||||
return _M_replace_safe(this->size(), size_type(0), __str._M_data()
|
||||
+ __pos, __n);
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _Traits, typename _Alloc>
|
||||
basic_string<_CharT, _Traits, _Alloc>&
|
||||
basic_string<_CharT, _Traits, _Alloc>::
|
||||
append(const _CharT* __s, size_type __n)
|
||||
{
|
||||
__glibcxx_requires_string_len(__s, __n);
|
||||
const size_type __len = __n + this->size();
|
||||
if (__len > this->capacity())
|
||||
this->reserve(__len);
|
||||
return _M_replace_safe(this->size(), size_type(0), __s, __n);
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _Traits, typename _Alloc>
|
||||
basic_string<_CharT, _Traits, _Alloc>
|
||||
operator+(const _CharT* __lhs,
|
||||
const basic_string<_CharT, _Traits, _Alloc>& __rhs)
|
||||
{
|
||||
__glibcxx_requires_string(__lhs);
|
||||
typedef basic_string<_CharT, _Traits, _Alloc> __string_type;
|
||||
typedef typename __string_type::size_type __size_type;
|
||||
const __size_type __len = _Traits::length(__lhs);
|
||||
__string_type __str;
|
||||
__str.reserve(__len + __rhs.size());
|
||||
__str.append(__lhs, __len);
|
||||
__str.append(__rhs);
|
||||
return __str;
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _Traits, typename _Alloc>
|
||||
basic_string<_CharT, _Traits, _Alloc>
|
||||
operator+(_CharT __lhs, const basic_string<_CharT, _Traits, _Alloc>& __rhs)
|
||||
{
|
||||
typedef basic_string<_CharT, _Traits, _Alloc> __string_type;
|
||||
typedef typename __string_type::size_type __size_type;
|
||||
__string_type __str;
|
||||
const __size_type __len = __rhs.size();
|
||||
__str.reserve(__len + 1);
|
||||
__str.append(__size_type(1), __lhs);
|
||||
__str.append(__rhs);
|
||||
return __str;
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _Traits, typename _Alloc>
|
||||
typename basic_string<_CharT, _Traits, _Alloc>::size_type
|
||||
basic_string<_CharT, _Traits, _Alloc>::
|
||||
copy(_CharT* __s, size_type __n, size_type __pos) const
|
||||
{
|
||||
_M_check(__pos, "basic_string::copy");
|
||||
__n = _M_limit(__pos, __n);
|
||||
__glibcxx_requires_string_len(__s, __n);
|
||||
if (__n)
|
||||
traits_type::copy(__s, _M_data() + __pos, __n);
|
||||
// 21.3.5.7 par 3: do not append null. (good.)
|
||||
return __n;
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _Traits, typename _Alloc>
|
||||
typename basic_string<_CharT, _Traits, _Alloc>::size_type
|
||||
basic_string<_CharT, _Traits, _Alloc>::
|
||||
find(const _CharT* __s, size_type __pos, size_type __n) const
|
||||
{
|
||||
__glibcxx_requires_string_len(__s, __n);
|
||||
const size_type __size = this->size();
|
||||
const _CharT* __data = _M_data();
|
||||
for (; __pos + __n <= __size; ++__pos)
|
||||
if (traits_type::compare(__data + __pos, __s, __n) == 0)
|
||||
return __pos;
|
||||
return npos;
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _Traits, typename _Alloc>
|
||||
typename basic_string<_CharT, _Traits, _Alloc>::size_type
|
||||
basic_string<_CharT, _Traits, _Alloc>::
|
||||
find(_CharT __c, size_type __pos) const
|
||||
{
|
||||
const size_type __size = this->size();
|
||||
size_type __ret = npos;
|
||||
if (__pos < __size)
|
||||
{
|
||||
const _CharT* __data = _M_data();
|
||||
const size_type __n = __size - __pos;
|
||||
const _CharT* __p = traits_type::find(__data + __pos, __n, __c);
|
||||
if (__p)
|
||||
__ret = __p - __data;
|
||||
}
|
||||
return __ret;
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _Traits, typename _Alloc>
|
||||
typename basic_string<_CharT, _Traits, _Alloc>::size_type
|
||||
basic_string<_CharT, _Traits, _Alloc>::
|
||||
rfind(const _CharT* __s, size_type __pos, size_type __n) const
|
||||
{
|
||||
__glibcxx_requires_string_len(__s, __n);
|
||||
const size_type __size = this->size();
|
||||
if (__n <= __size)
|
||||
{
|
||||
__pos = std::min(size_type(__size - __n), __pos);
|
||||
const _CharT* __data = _M_data();
|
||||
do
|
||||
{
|
||||
if (traits_type::compare(__data + __pos, __s, __n) == 0)
|
||||
return __pos;
|
||||
}
|
||||
while (__pos-- > 0);
|
||||
}
|
||||
return npos;
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _Traits, typename _Alloc>
|
||||
typename basic_string<_CharT, _Traits, _Alloc>::size_type
|
||||
basic_string<_CharT, _Traits, _Alloc>::
|
||||
rfind(_CharT __c, size_type __pos) const
|
||||
{
|
||||
size_type __size = this->size();
|
||||
if (__size)
|
||||
{
|
||||
if (--__size > __pos)
|
||||
__size = __pos;
|
||||
for (++__size; __size-- > 0; )
|
||||
if (traits_type::eq(_M_data()[__size], __c))
|
||||
return __size;
|
||||
}
|
||||
return npos;
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _Traits, typename _Alloc>
|
||||
typename basic_string<_CharT, _Traits, _Alloc>::size_type
|
||||
basic_string<_CharT, _Traits, _Alloc>::
|
||||
find_first_of(const _CharT* __s, size_type __pos, size_type __n) const
|
||||
{
|
||||
__glibcxx_requires_string_len(__s, __n);
|
||||
for (; __n && __pos < this->size(); ++__pos)
|
||||
{
|
||||
const _CharT* __p = traits_type::find(__s, __n, _M_data()[__pos]);
|
||||
if (__p)
|
||||
return __pos;
|
||||
}
|
||||
return npos;
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _Traits, typename _Alloc>
|
||||
typename basic_string<_CharT, _Traits, _Alloc>::size_type
|
||||
basic_string<_CharT, _Traits, _Alloc>::
|
||||
find_last_of(const _CharT* __s, size_type __pos, size_type __n) const
|
||||
{
|
||||
__glibcxx_requires_string_len(__s, __n);
|
||||
size_type __size = this->size();
|
||||
if (__size && __n)
|
||||
{
|
||||
if (--__size > __pos)
|
||||
__size = __pos;
|
||||
do
|
||||
{
|
||||
if (traits_type::find(__s, __n, _M_data()[__size]))
|
||||
return __size;
|
||||
}
|
||||
while (__size-- != 0);
|
||||
}
|
||||
return npos;
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _Traits, typename _Alloc>
|
||||
typename basic_string<_CharT, _Traits, _Alloc>::size_type
|
||||
basic_string<_CharT, _Traits, _Alloc>::
|
||||
find_first_not_of(const _CharT* __s, size_type __pos, size_type __n) const
|
||||
{
|
||||
__glibcxx_requires_string_len(__s, __n);
|
||||
for (; __pos < this->size(); ++__pos)
|
||||
if (!traits_type::find(__s, __n, _M_data()[__pos]))
|
||||
return __pos;
|
||||
return npos;
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _Traits, typename _Alloc>
|
||||
typename basic_string<_CharT, _Traits, _Alloc>::size_type
|
||||
basic_string<_CharT, _Traits, _Alloc>::
|
||||
find_first_not_of(_CharT __c, size_type __pos) const
|
||||
{
|
||||
for (; __pos < this->size(); ++__pos)
|
||||
if (!traits_type::eq(_M_data()[__pos], __c))
|
||||
return __pos;
|
||||
return npos;
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _Traits, typename _Alloc>
|
||||
typename basic_string<_CharT, _Traits, _Alloc>::size_type
|
||||
basic_string<_CharT, _Traits, _Alloc>::
|
||||
find_last_not_of(const _CharT* __s, size_type __pos, size_type __n) const
|
||||
{
|
||||
__glibcxx_requires_string_len(__s, __n);
|
||||
size_type __size = this->size();
|
||||
if (__size)
|
||||
{
|
||||
if (--__size > __pos)
|
||||
__size = __pos;
|
||||
do
|
||||
{
|
||||
if (!traits_type::find(__s, __n, _M_data()[__size]))
|
||||
return __size;
|
||||
}
|
||||
while (__size--);
|
||||
}
|
||||
return npos;
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _Traits, typename _Alloc>
|
||||
typename basic_string<_CharT, _Traits, _Alloc>::size_type
|
||||
basic_string<_CharT, _Traits, _Alloc>::
|
||||
find_last_not_of(_CharT __c, size_type __pos) const
|
||||
{
|
||||
size_type __size = this->size();
|
||||
if (__size)
|
||||
{
|
||||
if (--__size > __pos)
|
||||
__size = __pos;
|
||||
do
|
||||
{
|
||||
if (!traits_type::eq(_M_data()[__size], __c))
|
||||
return __size;
|
||||
}
|
||||
while (__size--);
|
||||
}
|
||||
return npos;
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _Traits, typename _Alloc>
|
||||
int
|
||||
basic_string<_CharT, _Traits, _Alloc>::
|
||||
compare(size_type __pos, size_type __n, const basic_string& __str) const
|
||||
{
|
||||
_M_check(__pos, "basic_string::compare");
|
||||
__n = _M_limit(__pos, __n);
|
||||
const size_type __osize = __str.size();
|
||||
const size_type __len = std::min(__n, __osize);
|
||||
int __r = traits_type::compare(_M_data() + __pos, __str.data(), __len);
|
||||
if (!__r)
|
||||
__r = __n - __osize;
|
||||
return __r;
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _Traits, typename _Alloc>
|
||||
int
|
||||
basic_string<_CharT, _Traits, _Alloc>::
|
||||
compare(size_type __pos1, size_type __n1, const basic_string& __str,
|
||||
size_type __pos2, size_type __n2) const
|
||||
{
|
||||
_M_check(__pos1, "basic_string::compare");
|
||||
__str._M_check(__pos2, "basic_string::compare");
|
||||
__n1 = _M_limit(__pos1, __n1);
|
||||
__n2 = __str._M_limit(__pos2, __n2);
|
||||
const size_type __len = std::min(__n1, __n2);
|
||||
int __r = traits_type::compare(_M_data() + __pos1,
|
||||
__str.data() + __pos2, __len);
|
||||
if (!__r)
|
||||
__r = __n1 - __n2;
|
||||
return __r;
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _Traits, typename _Alloc>
|
||||
int
|
||||
basic_string<_CharT, _Traits, _Alloc>::
|
||||
compare(const _CharT* __s) const
|
||||
{
|
||||
__glibcxx_requires_string(__s);
|
||||
const size_type __size = this->size();
|
||||
const size_type __osize = traits_type::length(__s);
|
||||
const size_type __len = std::min(__size, __osize);
|
||||
int __r = traits_type::compare(_M_data(), __s, __len);
|
||||
if (!__r)
|
||||
__r = __size - __osize;
|
||||
return __r;
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _Traits, typename _Alloc>
|
||||
int
|
||||
basic_string <_CharT, _Traits, _Alloc>::
|
||||
compare(size_type __pos, size_type __n1, const _CharT* __s) const
|
||||
{
|
||||
__glibcxx_requires_string(__s);
|
||||
_M_check(__pos, "basic_string::compare");
|
||||
__n1 = _M_limit(__pos, __n1);
|
||||
const size_type __osize = traits_type::length(__s);
|
||||
const size_type __len = std::min(__n1, __osize);
|
||||
int __r = traits_type::compare(_M_data() + __pos, __s, __len);
|
||||
if (!__r)
|
||||
__r = __n1 - __osize;
|
||||
return __r;
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _Traits, typename _Alloc>
|
||||
int
|
||||
basic_string <_CharT, _Traits, _Alloc>::
|
||||
compare(size_type __pos, size_type __n1, const _CharT* __s,
|
||||
size_type __n2) const
|
||||
{
|
||||
__glibcxx_requires_string_len(__s, __n2);
|
||||
_M_check(__pos, "basic_string::compare");
|
||||
__n1 = _M_limit(__pos, __n1);
|
||||
const size_type __len = std::min(__n1, __n2);
|
||||
int __r = traits_type::compare(_M_data() + __pos, __s, __len);
|
||||
if (!__r)
|
||||
__r = __n1 - __n2;
|
||||
return __r;
|
||||
}
|
||||
|
||||
// Inhibit implicit instantiations for required instantiations,
|
||||
// which are defined via explicit instantiations elsewhere.
|
||||
// NB: This syntax is a GNU extension.
|
||||
#if _GLIBCXX_EXTERN_TEMPLATE
|
||||
extern template class basic_string<char>;
|
||||
extern template
|
||||
basic_istream<char>&
|
||||
operator>>(basic_istream<char>&, string&);
|
||||
extern template
|
||||
basic_ostream<char>&
|
||||
operator<<(basic_ostream<char>&, const string&);
|
||||
extern template
|
||||
basic_istream<char>&
|
||||
getline(basic_istream<char>&, string&, char);
|
||||
extern template
|
||||
basic_istream<char>&
|
||||
getline(basic_istream<char>&, string&);
|
||||
|
||||
#ifdef _GLIBCXX_USE_WCHAR_T
|
||||
extern template class basic_string<wchar_t>;
|
||||
extern template
|
||||
basic_istream<wchar_t>&
|
||||
operator>>(basic_istream<wchar_t>&, wstring&);
|
||||
extern template
|
||||
basic_ostream<wchar_t>&
|
||||
operator<<(basic_ostream<wchar_t>&, const wstring&);
|
||||
extern template
|
||||
basic_istream<wchar_t>&
|
||||
getline(basic_istream<wchar_t>&, wstring&, wchar_t);
|
||||
extern template
|
||||
basic_istream<wchar_t>&
|
||||
getline(basic_istream<wchar_t>&, wstring&);
|
||||
#endif
|
||||
#endif
|
||||
} // namespace std
|
||||
|
||||
#endif
|
||||
@ -0,0 +1,900 @@
|
||||
//
|
||||
// (C) Copyright Jeremy Siek 2000. Permission to copy, use, modify,
|
||||
// sell and distribute this software is granted provided this
|
||||
// copyright notice appears in all copies. This software is provided
|
||||
// "as is" without express or implied warranty, and with no claim as
|
||||
// to its suitability for any purpose.
|
||||
//
|
||||
|
||||
// GCC Note: based on version 1.12.0 of the Boost library.
|
||||
|
||||
/** @file boost_concept_check.h
|
||||
* This is an internal header file, included by other library headers.
|
||||
* You should not attempt to use it directly.
|
||||
*/
|
||||
|
||||
#ifndef _BOOST_CONCEPT_CHECK_H
|
||||
#define _BOOST_CONCEPT_CHECK_H 1
|
||||
|
||||
#pragma GCC system_header
|
||||
|
||||
#include <cstddef> // for ptrdiff_t, used next
|
||||
#include <bits/stl_iterator_base_types.h> // for traits and tags
|
||||
#include <utility> // for pair<>
|
||||
|
||||
namespace __gnu_cxx
|
||||
{
|
||||
|
||||
#define _IsUnused __attribute__ ((__unused__))
|
||||
|
||||
// When the C-C code is in use, we would like this function to do as little
|
||||
// as possible at runtime, use as few resources as possible, and hopefully
|
||||
// be elided out of existence... hmmm.
|
||||
template <class _Concept>
|
||||
inline void __function_requires()
|
||||
{
|
||||
void (_Concept::*__x)() _IsUnused = &_Concept::__constraints;
|
||||
}
|
||||
|
||||
|
||||
// ??? Should the "concept_checking*" structs begin with more than _ ?
|
||||
#define _GLIBCXX_CLASS_REQUIRES(_type_var, _ns, _concept) \
|
||||
typedef void (_ns::_concept <_type_var>::* _func##_type_var##_concept)(); \
|
||||
template <_func##_type_var##_concept _Tp1> \
|
||||
struct _concept_checking##_type_var##_concept { }; \
|
||||
typedef _concept_checking##_type_var##_concept< \
|
||||
&_ns::_concept <_type_var>::__constraints> \
|
||||
_concept_checking_typedef##_type_var##_concept
|
||||
|
||||
#define _GLIBCXX_CLASS_REQUIRES2(_type_var1, _type_var2, _ns, _concept) \
|
||||
typedef void (_ns::_concept <_type_var1,_type_var2>::* _func##_type_var1##_type_var2##_concept)(); \
|
||||
template <_func##_type_var1##_type_var2##_concept _Tp1> \
|
||||
struct _concept_checking##_type_var1##_type_var2##_concept { }; \
|
||||
typedef _concept_checking##_type_var1##_type_var2##_concept< \
|
||||
&_ns::_concept <_type_var1,_type_var2>::__constraints> \
|
||||
_concept_checking_typedef##_type_var1##_type_var2##_concept
|
||||
|
||||
#define _GLIBCXX_CLASS_REQUIRES3(_type_var1, _type_var2, _type_var3, _ns, _concept) \
|
||||
typedef void (_ns::_concept <_type_var1,_type_var2,_type_var3>::* _func##_type_var1##_type_var2##_type_var3##_concept)(); \
|
||||
template <_func##_type_var1##_type_var2##_type_var3##_concept _Tp1> \
|
||||
struct _concept_checking##_type_var1##_type_var2##_type_var3##_concept { }; \
|
||||
typedef _concept_checking##_type_var1##_type_var2##_type_var3##_concept< \
|
||||
&_ns::_concept <_type_var1,_type_var2,_type_var3>::__constraints> \
|
||||
_concept_checking_typedef##_type_var1##_type_var2##_type_var3##_concept
|
||||
|
||||
#define _GLIBCXX_CLASS_REQUIRES4(_type_var1, _type_var2, _type_var3, _type_var4, _ns, _concept) \
|
||||
typedef void (_ns::_concept <_type_var1,_type_var2,_type_var3,_type_var4>::* _func##_type_var1##_type_var2##_type_var3##_type_var4##_concept)(); \
|
||||
template <_func##_type_var1##_type_var2##_type_var3##_type_var4##_concept _Tp1> \
|
||||
struct _concept_checking##_type_var1##_type_var2##_type_var3##_type_var4##_concept { }; \
|
||||
typedef _concept_checking##_type_var1##_type_var2##_type_var3##_type_var4##_concept< \
|
||||
&_ns::_concept <_type_var1,_type_var2,_type_var3,_type_var4>::__constraints> \
|
||||
_concept_checking_typedef##_type_var1##_type_var2##_type_var3##_type_var4##_concept
|
||||
|
||||
|
||||
template <class _Tp1, class _Tp2>
|
||||
struct _Aux_require_same { };
|
||||
|
||||
template <class _Tp>
|
||||
struct _Aux_require_same<_Tp,_Tp> { typedef _Tp _Type; };
|
||||
|
||||
template <class _Tp1, class _Tp2>
|
||||
struct _SameTypeConcept
|
||||
{
|
||||
void __constraints() {
|
||||
typedef typename _Aux_require_same<_Tp1, _Tp2>::_Type _Required;
|
||||
}
|
||||
};
|
||||
|
||||
template <class _Tp>
|
||||
struct _IntegerConcept {
|
||||
void __constraints() {
|
||||
this->__error_type_must_be_an_integer_type();
|
||||
}
|
||||
};
|
||||
template <> struct _IntegerConcept<short> { void __constraints() {} };
|
||||
template <> struct _IntegerConcept<unsigned short> { void __constraints(){} };
|
||||
template <> struct _IntegerConcept<int> { void __constraints() {} };
|
||||
template <> struct _IntegerConcept<unsigned int> { void __constraints() {} };
|
||||
template <> struct _IntegerConcept<long> { void __constraints() {} };
|
||||
template <> struct _IntegerConcept<unsigned long> { void __constraints() {} };
|
||||
template <> struct _IntegerConcept<long long> { void __constraints() {} };
|
||||
template <> struct _IntegerConcept<unsigned long long>
|
||||
{ void __constraints() {} };
|
||||
|
||||
template <class _Tp>
|
||||
struct _SignedIntegerConcept {
|
||||
void __constraints() {
|
||||
this->__error_type_must_be_a_signed_integer_type();
|
||||
}
|
||||
};
|
||||
template <> struct _SignedIntegerConcept<short> { void __constraints() {} };
|
||||
template <> struct _SignedIntegerConcept<int> { void __constraints() {} };
|
||||
template <> struct _SignedIntegerConcept<long> { void __constraints() {} };
|
||||
template <> struct _SignedIntegerConcept<long long> { void __constraints(){}};
|
||||
|
||||
template <class _Tp>
|
||||
struct _UnsignedIntegerConcept {
|
||||
void __constraints() {
|
||||
this->__error_type_must_be_an_unsigned_integer_type();
|
||||
}
|
||||
};
|
||||
template <> struct _UnsignedIntegerConcept<unsigned short>
|
||||
{ void __constraints() {} };
|
||||
template <> struct _UnsignedIntegerConcept<unsigned int>
|
||||
{ void __constraints() {} };
|
||||
template <> struct _UnsignedIntegerConcept<unsigned long>
|
||||
{ void __constraints() {} };
|
||||
template <> struct _UnsignedIntegerConcept<unsigned long long>
|
||||
{ void __constraints() {} };
|
||||
|
||||
//===========================================================================
|
||||
// Basic Concepts
|
||||
|
||||
template <class _Tp>
|
||||
struct _DefaultConstructibleConcept
|
||||
{
|
||||
void __constraints() {
|
||||
_Tp __a _IsUnused; // require default constructor
|
||||
}
|
||||
};
|
||||
|
||||
template <class _Tp>
|
||||
struct _AssignableConcept
|
||||
{
|
||||
void __constraints() {
|
||||
__a = __a; // require assignment operator
|
||||
__const_constraints(__a);
|
||||
}
|
||||
void __const_constraints(const _Tp& __b) {
|
||||
__a = __b; // const required for argument to assignment
|
||||
}
|
||||
_Tp __a;
|
||||
// possibly should be "Tp* a;" and then dereference "a" in constraint
|
||||
// functions? present way would require a default ctor, i think...
|
||||
};
|
||||
|
||||
template <class _Tp>
|
||||
struct _CopyConstructibleConcept
|
||||
{
|
||||
void __constraints() {
|
||||
_Tp __a(__b); // require copy constructor
|
||||
_Tp* __ptr _IsUnused = &__a; // require address of operator
|
||||
__const_constraints(__a);
|
||||
}
|
||||
void __const_constraints(const _Tp& __a) {
|
||||
_Tp __c(__a) _IsUnused; // require const copy constructor
|
||||
const _Tp* __ptr _IsUnused = &__a; // require const address of operator
|
||||
}
|
||||
_Tp __b;
|
||||
};
|
||||
|
||||
// The SGI STL version of Assignable requires copy constructor and operator=
|
||||
template <class _Tp>
|
||||
struct _SGIAssignableConcept
|
||||
{
|
||||
void __constraints() {
|
||||
_Tp __b(__a) _IsUnused;
|
||||
__a = __a; // require assignment operator
|
||||
__const_constraints(__a);
|
||||
}
|
||||
void __const_constraints(const _Tp& __b) {
|
||||
_Tp __c(__b) _IsUnused;
|
||||
__a = __b; // const required for argument to assignment
|
||||
}
|
||||
_Tp __a;
|
||||
};
|
||||
|
||||
template <class _From, class _To>
|
||||
struct _ConvertibleConcept
|
||||
{
|
||||
void __constraints() {
|
||||
_To __y _IsUnused = __x;
|
||||
}
|
||||
_From __x;
|
||||
};
|
||||
|
||||
// The C++ standard requirements for many concepts talk about return
|
||||
// types that must be "convertible to bool". The problem with this
|
||||
// requirement is that it leaves the door open for evil proxies that
|
||||
// define things like operator|| with strange return types. Two
|
||||
// possible solutions are:
|
||||
// 1) require the return type to be exactly bool
|
||||
// 2) stay with convertible to bool, and also
|
||||
// specify stuff about all the logical operators.
|
||||
// For now we just test for convertible to bool.
|
||||
template <class _Tp>
|
||||
void __aux_require_boolean_expr(const _Tp& __t) {
|
||||
bool __x _IsUnused = __t;
|
||||
}
|
||||
|
||||
// FIXME
|
||||
template <class _Tp>
|
||||
struct _EqualityComparableConcept
|
||||
{
|
||||
void __constraints() {
|
||||
__aux_require_boolean_expr(__a == __b);
|
||||
}
|
||||
_Tp __a, __b;
|
||||
};
|
||||
|
||||
template <class _Tp>
|
||||
struct _LessThanComparableConcept
|
||||
{
|
||||
void __constraints() {
|
||||
__aux_require_boolean_expr(__a < __b);
|
||||
}
|
||||
_Tp __a, __b;
|
||||
};
|
||||
|
||||
// This is equivalent to SGI STL's LessThanComparable.
|
||||
template <class _Tp>
|
||||
struct _ComparableConcept
|
||||
{
|
||||
void __constraints() {
|
||||
__aux_require_boolean_expr(__a < __b);
|
||||
__aux_require_boolean_expr(__a > __b);
|
||||
__aux_require_boolean_expr(__a <= __b);
|
||||
__aux_require_boolean_expr(__a >= __b);
|
||||
}
|
||||
_Tp __a, __b;
|
||||
};
|
||||
|
||||
#define _GLIBCXX_DEFINE_BINARY_PREDICATE_OP_CONSTRAINT(_OP,_NAME) \
|
||||
template <class _First, class _Second> \
|
||||
struct _NAME { \
|
||||
void __constraints() { (void)__constraints_(); } \
|
||||
bool __constraints_() { \
|
||||
return __a _OP __b; \
|
||||
} \
|
||||
_First __a; \
|
||||
_Second __b; \
|
||||
}
|
||||
|
||||
#define _GLIBCXX_DEFINE_BINARY_OPERATOR_CONSTRAINT(_OP,_NAME) \
|
||||
template <class _Ret, class _First, class _Second> \
|
||||
struct _NAME { \
|
||||
void __constraints() { (void)__constraints_(); } \
|
||||
_Ret __constraints_() { \
|
||||
return __a _OP __b; \
|
||||
} \
|
||||
_First __a; \
|
||||
_Second __b; \
|
||||
}
|
||||
|
||||
_GLIBCXX_DEFINE_BINARY_PREDICATE_OP_CONSTRAINT(==, _EqualOpConcept);
|
||||
_GLIBCXX_DEFINE_BINARY_PREDICATE_OP_CONSTRAINT(!=, _NotEqualOpConcept);
|
||||
_GLIBCXX_DEFINE_BINARY_PREDICATE_OP_CONSTRAINT(<, _LessThanOpConcept);
|
||||
_GLIBCXX_DEFINE_BINARY_PREDICATE_OP_CONSTRAINT(<=, _LessEqualOpConcept);
|
||||
_GLIBCXX_DEFINE_BINARY_PREDICATE_OP_CONSTRAINT(>, _GreaterThanOpConcept);
|
||||
_GLIBCXX_DEFINE_BINARY_PREDICATE_OP_CONSTRAINT(>=, _GreaterEqualOpConcept);
|
||||
|
||||
_GLIBCXX_DEFINE_BINARY_OPERATOR_CONSTRAINT(+, _PlusOpConcept);
|
||||
_GLIBCXX_DEFINE_BINARY_OPERATOR_CONSTRAINT(*, _TimesOpConcept);
|
||||
_GLIBCXX_DEFINE_BINARY_OPERATOR_CONSTRAINT(/, _DivideOpConcept);
|
||||
_GLIBCXX_DEFINE_BINARY_OPERATOR_CONSTRAINT(-, _SubtractOpConcept);
|
||||
_GLIBCXX_DEFINE_BINARY_OPERATOR_CONSTRAINT(%, _ModOpConcept);
|
||||
|
||||
#undef _GLIBCXX_DEFINE_BINARY_PREDICATE_OP_CONSTRAINT
|
||||
#undef _GLIBCXX_DEFINE_BINARY_OPERATOR_CONSTRAINT
|
||||
|
||||
//===========================================================================
|
||||
// Function Object Concepts
|
||||
|
||||
template <class _Func, class _Return>
|
||||
struct _GeneratorConcept
|
||||
{
|
||||
void __constraints() {
|
||||
const _Return& __r _IsUnused = __f();// require operator() member function
|
||||
}
|
||||
_Func __f;
|
||||
};
|
||||
|
||||
|
||||
template <class _Func>
|
||||
struct _GeneratorConcept<_Func,void>
|
||||
{
|
||||
void __constraints() {
|
||||
__f(); // require operator() member function
|
||||
}
|
||||
_Func __f;
|
||||
};
|
||||
|
||||
template <class _Func, class _Return, class _Arg>
|
||||
struct _UnaryFunctionConcept
|
||||
{
|
||||
void __constraints() {
|
||||
__r = __f(__arg); // require operator()
|
||||
}
|
||||
_Func __f;
|
||||
_Arg __arg;
|
||||
_Return __r;
|
||||
};
|
||||
|
||||
template <class _Func, class _Arg>
|
||||
struct _UnaryFunctionConcept<_Func, void, _Arg> {
|
||||
void __constraints() {
|
||||
__f(__arg); // require operator()
|
||||
}
|
||||
_Func __f;
|
||||
_Arg __arg;
|
||||
};
|
||||
|
||||
template <class _Func, class _Return, class _First, class _Second>
|
||||
struct _BinaryFunctionConcept
|
||||
{
|
||||
void __constraints() {
|
||||
__r = __f(__first, __second); // require operator()
|
||||
}
|
||||
_Func __f;
|
||||
_First __first;
|
||||
_Second __second;
|
||||
_Return __r;
|
||||
};
|
||||
|
||||
template <class _Func, class _First, class _Second>
|
||||
struct _BinaryFunctionConcept<_Func, void, _First, _Second>
|
||||
{
|
||||
void __constraints() {
|
||||
__f(__first, __second); // require operator()
|
||||
}
|
||||
_Func __f;
|
||||
_First __first;
|
||||
_Second __second;
|
||||
};
|
||||
|
||||
template <class _Func, class _Arg>
|
||||
struct _UnaryPredicateConcept
|
||||
{
|
||||
void __constraints() {
|
||||
__aux_require_boolean_expr(__f(__arg)); // require op() returning bool
|
||||
}
|
||||
_Func __f;
|
||||
_Arg __arg;
|
||||
};
|
||||
|
||||
template <class _Func, class _First, class _Second>
|
||||
struct _BinaryPredicateConcept
|
||||
{
|
||||
void __constraints() {
|
||||
__aux_require_boolean_expr(__f(__a, __b)); // require op() returning bool
|
||||
}
|
||||
_Func __f;
|
||||
_First __a;
|
||||
_Second __b;
|
||||
};
|
||||
|
||||
// use this when functor is used inside a container class like std::set
|
||||
template <class _Func, class _First, class _Second>
|
||||
struct _Const_BinaryPredicateConcept {
|
||||
void __constraints() {
|
||||
__const_constraints(__f);
|
||||
}
|
||||
void __const_constraints(const _Func& __fun) {
|
||||
__function_requires<_BinaryPredicateConcept<_Func, _First, _Second> >();
|
||||
// operator() must be a const member function
|
||||
__aux_require_boolean_expr(__fun(__a, __b));
|
||||
}
|
||||
_Func __f;
|
||||
_First __a;
|
||||
_Second __b;
|
||||
};
|
||||
|
||||
//===========================================================================
|
||||
// Iterator Concepts
|
||||
|
||||
template <class _Tp>
|
||||
struct _TrivialIteratorConcept
|
||||
{
|
||||
void __constraints() {
|
||||
__function_requires< _DefaultConstructibleConcept<_Tp> >();
|
||||
__function_requires< _AssignableConcept<_Tp> >();
|
||||
__function_requires< _EqualityComparableConcept<_Tp> >();
|
||||
// typedef typename std::iterator_traits<_Tp>::value_type _V;
|
||||
(void)*__i; // require dereference operator
|
||||
}
|
||||
_Tp __i;
|
||||
};
|
||||
|
||||
template <class _Tp>
|
||||
struct _Mutable_TrivialIteratorConcept
|
||||
{
|
||||
void __constraints() {
|
||||
__function_requires< _TrivialIteratorConcept<_Tp> >();
|
||||
*__i = *__j; // require dereference and assignment
|
||||
}
|
||||
_Tp __i, __j;
|
||||
};
|
||||
|
||||
template <class _Tp>
|
||||
struct _InputIteratorConcept
|
||||
{
|
||||
void __constraints() {
|
||||
__function_requires< _TrivialIteratorConcept<_Tp> >();
|
||||
// require iterator_traits typedef's
|
||||
typedef typename std::iterator_traits<_Tp>::difference_type _Diff;
|
||||
// __function_requires< _SignedIntegerConcept<_Diff> >();
|
||||
typedef typename std::iterator_traits<_Tp>::reference _Ref;
|
||||
typedef typename std::iterator_traits<_Tp>::pointer _Pt;
|
||||
typedef typename std::iterator_traits<_Tp>::iterator_category _Cat;
|
||||
__function_requires< _ConvertibleConcept<
|
||||
typename std::iterator_traits<_Tp>::iterator_category,
|
||||
std::input_iterator_tag> >();
|
||||
++__i; // require preincrement operator
|
||||
__i++; // require postincrement operator
|
||||
}
|
||||
_Tp __i;
|
||||
};
|
||||
|
||||
template <class _Tp, class _ValueT>
|
||||
struct _OutputIteratorConcept
|
||||
{
|
||||
void __constraints() {
|
||||
__function_requires< _AssignableConcept<_Tp> >();
|
||||
++__i; // require preincrement operator
|
||||
__i++; // require postincrement operator
|
||||
*__i++ = __t; // require postincrement and assignment
|
||||
}
|
||||
_Tp __i;
|
||||
_ValueT __t;
|
||||
};
|
||||
|
||||
template <class _Tp>
|
||||
struct _ForwardIteratorConcept
|
||||
{
|
||||
void __constraints() {
|
||||
__function_requires< _InputIteratorConcept<_Tp> >();
|
||||
__function_requires< _ConvertibleConcept<
|
||||
typename std::iterator_traits<_Tp>::iterator_category,
|
||||
std::forward_iterator_tag> >();
|
||||
typedef typename std::iterator_traits<_Tp>::reference _Ref;
|
||||
_Ref __r _IsUnused = *__i;
|
||||
}
|
||||
_Tp __i;
|
||||
};
|
||||
|
||||
template <class _Tp>
|
||||
struct _Mutable_ForwardIteratorConcept
|
||||
{
|
||||
void __constraints() {
|
||||
__function_requires< _ForwardIteratorConcept<_Tp> >();
|
||||
*__i++ = *__i; // require postincrement and assignment
|
||||
}
|
||||
_Tp __i;
|
||||
};
|
||||
|
||||
template <class _Tp>
|
||||
struct _BidirectionalIteratorConcept
|
||||
{
|
||||
void __constraints() {
|
||||
__function_requires< _ForwardIteratorConcept<_Tp> >();
|
||||
__function_requires< _ConvertibleConcept<
|
||||
typename std::iterator_traits<_Tp>::iterator_category,
|
||||
std::bidirectional_iterator_tag> >();
|
||||
--__i; // require predecrement operator
|
||||
__i--; // require postdecrement operator
|
||||
}
|
||||
_Tp __i;
|
||||
};
|
||||
|
||||
template <class _Tp>
|
||||
struct _Mutable_BidirectionalIteratorConcept
|
||||
{
|
||||
void __constraints() {
|
||||
__function_requires< _BidirectionalIteratorConcept<_Tp> >();
|
||||
__function_requires< _Mutable_ForwardIteratorConcept<_Tp> >();
|
||||
*__i-- = *__i; // require postdecrement and assignment
|
||||
}
|
||||
_Tp __i;
|
||||
};
|
||||
|
||||
|
||||
template <class _Tp>
|
||||
struct _RandomAccessIteratorConcept
|
||||
{
|
||||
void __constraints() {
|
||||
__function_requires< _BidirectionalIteratorConcept<_Tp> >();
|
||||
__function_requires< _ComparableConcept<_Tp> >();
|
||||
__function_requires< _ConvertibleConcept<
|
||||
typename std::iterator_traits<_Tp>::iterator_category,
|
||||
std::random_access_iterator_tag> >();
|
||||
// ??? We don't use _Ref, are we just checking for "referenceability"?
|
||||
typedef typename std::iterator_traits<_Tp>::reference _Ref;
|
||||
|
||||
__i += __n; // require assignment addition operator
|
||||
__i = __i + __n; __i = __n + __i; // require addition with difference type
|
||||
__i -= __n; // require assignment subtraction op
|
||||
__i = __i - __n; // require subtraction with
|
||||
// difference type
|
||||
__n = __i - __j; // require difference operator
|
||||
(void)__i[__n]; // require element access operator
|
||||
}
|
||||
_Tp __a, __b;
|
||||
_Tp __i, __j;
|
||||
typename std::iterator_traits<_Tp>::difference_type __n;
|
||||
};
|
||||
|
||||
template <class _Tp>
|
||||
struct _Mutable_RandomAccessIteratorConcept
|
||||
{
|
||||
void __constraints() {
|
||||
__function_requires< _RandomAccessIteratorConcept<_Tp> >();
|
||||
__function_requires< _Mutable_BidirectionalIteratorConcept<_Tp> >();
|
||||
__i[__n] = *__i; // require element access and assignment
|
||||
}
|
||||
_Tp __i;
|
||||
typename std::iterator_traits<_Tp>::difference_type __n;
|
||||
};
|
||||
|
||||
//===========================================================================
|
||||
// Container Concepts
|
||||
|
||||
template <class _Container>
|
||||
struct _ContainerConcept
|
||||
{
|
||||
typedef typename _Container::value_type _Value_type;
|
||||
typedef typename _Container::difference_type _Difference_type;
|
||||
typedef typename _Container::size_type _Size_type;
|
||||
typedef typename _Container::const_reference _Const_reference;
|
||||
typedef typename _Container::const_pointer _Const_pointer;
|
||||
typedef typename _Container::const_iterator _Const_iterator;
|
||||
|
||||
void __constraints() {
|
||||
__function_requires< _InputIteratorConcept<_Const_iterator> >();
|
||||
__function_requires< _AssignableConcept<_Container> >();
|
||||
const _Container __c;
|
||||
__i = __c.begin();
|
||||
__i = __c.end();
|
||||
__n = __c.size();
|
||||
__n = __c.max_size();
|
||||
__b = __c.empty();
|
||||
}
|
||||
bool __b;
|
||||
_Const_iterator __i;
|
||||
_Size_type __n;
|
||||
};
|
||||
|
||||
template <class _Container>
|
||||
struct _Mutable_ContainerConcept
|
||||
{
|
||||
typedef typename _Container::value_type _Value_type;
|
||||
typedef typename _Container::reference _Reference;
|
||||
typedef typename _Container::iterator _Iterator;
|
||||
typedef typename _Container::pointer _Pointer;
|
||||
|
||||
void __constraints() {
|
||||
__function_requires< _ContainerConcept<_Container> >();
|
||||
__function_requires< _AssignableConcept<_Value_type> >();
|
||||
__function_requires< _InputIteratorConcept<_Iterator> >();
|
||||
|
||||
__i = __c.begin();
|
||||
__i = __c.end();
|
||||
__c.swap(__c2);
|
||||
}
|
||||
_Iterator __i;
|
||||
_Container __c, __c2;
|
||||
};
|
||||
|
||||
template <class _ForwardContainer>
|
||||
struct _ForwardContainerConcept
|
||||
{
|
||||
void __constraints() {
|
||||
__function_requires< _ContainerConcept<_ForwardContainer> >();
|
||||
typedef typename _ForwardContainer::const_iterator _Const_iterator;
|
||||
__function_requires< _ForwardIteratorConcept<_Const_iterator> >();
|
||||
}
|
||||
};
|
||||
|
||||
template <class _ForwardContainer>
|
||||
struct _Mutable_ForwardContainerConcept
|
||||
{
|
||||
void __constraints() {
|
||||
__function_requires< _ForwardContainerConcept<_ForwardContainer> >();
|
||||
__function_requires< _Mutable_ContainerConcept<_ForwardContainer> >();
|
||||
typedef typename _ForwardContainer::iterator _Iterator;
|
||||
__function_requires< _Mutable_ForwardIteratorConcept<_Iterator> >();
|
||||
}
|
||||
};
|
||||
|
||||
template <class _ReversibleContainer>
|
||||
struct _ReversibleContainerConcept
|
||||
{
|
||||
typedef typename _ReversibleContainer::const_iterator _Const_iterator;
|
||||
typedef typename _ReversibleContainer::const_reverse_iterator
|
||||
_Const_reverse_iterator;
|
||||
|
||||
void __constraints() {
|
||||
__function_requires< _ForwardContainerConcept<_ReversibleContainer> >();
|
||||
__function_requires< _BidirectionalIteratorConcept<_Const_iterator> >();
|
||||
__function_requires<
|
||||
_BidirectionalIteratorConcept<_Const_reverse_iterator> >();
|
||||
|
||||
const _ReversibleContainer __c;
|
||||
_Const_reverse_iterator __i = __c.rbegin();
|
||||
__i = __c.rend();
|
||||
}
|
||||
};
|
||||
|
||||
template <class _ReversibleContainer>
|
||||
struct _Mutable_ReversibleContainerConcept
|
||||
{
|
||||
typedef typename _ReversibleContainer::iterator _Iterator;
|
||||
typedef typename _ReversibleContainer::reverse_iterator _Reverse_iterator;
|
||||
|
||||
void __constraints() {
|
||||
__function_requires<_ReversibleContainerConcept<_ReversibleContainer> >();
|
||||
__function_requires<
|
||||
_Mutable_ForwardContainerConcept<_ReversibleContainer> >();
|
||||
__function_requires<_Mutable_BidirectionalIteratorConcept<_Iterator> >();
|
||||
__function_requires<
|
||||
_Mutable_BidirectionalIteratorConcept<_Reverse_iterator> >();
|
||||
|
||||
_Reverse_iterator __i = __c.rbegin();
|
||||
__i = __c.rend();
|
||||
}
|
||||
_ReversibleContainer __c;
|
||||
};
|
||||
|
||||
template <class _RandomAccessContainer>
|
||||
struct _RandomAccessContainerConcept
|
||||
{
|
||||
typedef typename _RandomAccessContainer::size_type _Size_type;
|
||||
typedef typename _RandomAccessContainer::const_reference _Const_reference;
|
||||
typedef typename _RandomAccessContainer::const_iterator _Const_iterator;
|
||||
typedef typename _RandomAccessContainer::const_reverse_iterator
|
||||
_Const_reverse_iterator;
|
||||
|
||||
void __constraints() {
|
||||
__function_requires<
|
||||
_ReversibleContainerConcept<_RandomAccessContainer> >();
|
||||
__function_requires< _RandomAccessIteratorConcept<_Const_iterator> >();
|
||||
__function_requires<
|
||||
_RandomAccessIteratorConcept<_Const_reverse_iterator> >();
|
||||
|
||||
const _RandomAccessContainer __c;
|
||||
_Const_reference __r _IsUnused = __c[__n];
|
||||
}
|
||||
_Size_type __n;
|
||||
};
|
||||
|
||||
template <class _RandomAccessContainer>
|
||||
struct _Mutable_RandomAccessContainerConcept
|
||||
{
|
||||
typedef typename _RandomAccessContainer::size_type _Size_type;
|
||||
typedef typename _RandomAccessContainer::reference _Reference;
|
||||
typedef typename _RandomAccessContainer::iterator _Iterator;
|
||||
typedef typename _RandomAccessContainer::reverse_iterator _Reverse_iterator;
|
||||
|
||||
void __constraints() {
|
||||
__function_requires<
|
||||
_RandomAccessContainerConcept<_RandomAccessContainer> >();
|
||||
__function_requires<
|
||||
_Mutable_ReversibleContainerConcept<_RandomAccessContainer> >();
|
||||
__function_requires< _Mutable_RandomAccessIteratorConcept<_Iterator> >();
|
||||
__function_requires<
|
||||
_Mutable_RandomAccessIteratorConcept<_Reverse_iterator> >();
|
||||
|
||||
_Reference __r _IsUnused = __c[__i];
|
||||
}
|
||||
_Size_type __i;
|
||||
_RandomAccessContainer __c;
|
||||
};
|
||||
|
||||
// A Sequence is inherently mutable
|
||||
template <class _Sequence>
|
||||
struct _SequenceConcept
|
||||
{
|
||||
typedef typename _Sequence::reference _Reference;
|
||||
typedef typename _Sequence::const_reference _Const_reference;
|
||||
|
||||
void __constraints() {
|
||||
// Matt Austern's book puts DefaultConstructible here, the C++
|
||||
// standard places it in Container
|
||||
// function_requires< DefaultConstructible<Sequence> >();
|
||||
__function_requires< _Mutable_ForwardContainerConcept<_Sequence> >();
|
||||
__function_requires< _DefaultConstructibleConcept<_Sequence> >();
|
||||
|
||||
_Sequence
|
||||
__c(__n) _IsUnused,
|
||||
__c2(__n, __t) _IsUnused,
|
||||
__c3(__first, __last) _IsUnused;
|
||||
|
||||
__c.insert(__p, __t);
|
||||
__c.insert(__p, __n, __t);
|
||||
__c.insert(__p, __first, __last);
|
||||
|
||||
__c.erase(__p);
|
||||
__c.erase(__p, __q);
|
||||
|
||||
_Reference __r _IsUnused = __c.front();
|
||||
|
||||
__const_constraints(__c);
|
||||
}
|
||||
void __const_constraints(const _Sequence& __c) {
|
||||
_Const_reference __r _IsUnused = __c.front();
|
||||
}
|
||||
typename _Sequence::value_type __t;
|
||||
typename _Sequence::size_type __n;
|
||||
typename _Sequence::value_type *__first, *__last;
|
||||
typename _Sequence::iterator __p, __q;
|
||||
};
|
||||
|
||||
template <class _FrontInsertionSequence>
|
||||
struct _FrontInsertionSequenceConcept
|
||||
{
|
||||
void __constraints() {
|
||||
__function_requires< _SequenceConcept<_FrontInsertionSequence> >();
|
||||
|
||||
__c.push_front(__t);
|
||||
__c.pop_front();
|
||||
}
|
||||
_FrontInsertionSequence __c;
|
||||
typename _FrontInsertionSequence::value_type __t;
|
||||
};
|
||||
|
||||
template <class _BackInsertionSequence>
|
||||
struct _BackInsertionSequenceConcept
|
||||
{
|
||||
typedef typename _BackInsertionSequence::reference _Reference;
|
||||
typedef typename _BackInsertionSequence::const_reference _Const_reference;
|
||||
|
||||
void __constraints() {
|
||||
__function_requires< _SequenceConcept<_BackInsertionSequence> >();
|
||||
|
||||
__c.push_back(__t);
|
||||
__c.pop_back();
|
||||
_Reference __r _IsUnused = __c.back();
|
||||
}
|
||||
void __const_constraints(const _BackInsertionSequence& __c) {
|
||||
_Const_reference __r _IsUnused = __c.back();
|
||||
};
|
||||
_BackInsertionSequence __c;
|
||||
typename _BackInsertionSequence::value_type __t;
|
||||
};
|
||||
|
||||
template <class _AssociativeContainer>
|
||||
struct _AssociativeContainerConcept
|
||||
{
|
||||
void __constraints() {
|
||||
__function_requires< _ForwardContainerConcept<_AssociativeContainer> >();
|
||||
__function_requires<
|
||||
_DefaultConstructibleConcept<_AssociativeContainer> >();
|
||||
|
||||
__i = __c.find(__k);
|
||||
__r = __c.equal_range(__k);
|
||||
__c.erase(__k);
|
||||
__c.erase(__i);
|
||||
__c.erase(__r.first, __r.second);
|
||||
__const_constraints(__c);
|
||||
}
|
||||
void __const_constraints(const _AssociativeContainer& __c) {
|
||||
__ci = __c.find(__k);
|
||||
__n = __c.count(__k);
|
||||
__cr = __c.equal_range(__k);
|
||||
}
|
||||
typedef typename _AssociativeContainer::iterator _Iterator;
|
||||
typedef typename _AssociativeContainer::const_iterator _Const_iterator;
|
||||
|
||||
_AssociativeContainer __c;
|
||||
_Iterator __i;
|
||||
std::pair<_Iterator,_Iterator> __r;
|
||||
_Const_iterator __ci;
|
||||
std::pair<_Const_iterator,_Const_iterator> __cr;
|
||||
typename _AssociativeContainer::key_type __k;
|
||||
typename _AssociativeContainer::size_type __n;
|
||||
};
|
||||
|
||||
template <class _UniqueAssociativeContainer>
|
||||
struct _UniqueAssociativeContainerConcept
|
||||
{
|
||||
void __constraints() {
|
||||
__function_requires<
|
||||
_AssociativeContainerConcept<_UniqueAssociativeContainer> >();
|
||||
|
||||
_UniqueAssociativeContainer __c(__first, __last);
|
||||
|
||||
__pos_flag = __c.insert(__t);
|
||||
__c.insert(__first, __last);
|
||||
}
|
||||
std::pair<typename _UniqueAssociativeContainer::iterator, bool> __pos_flag;
|
||||
typename _UniqueAssociativeContainer::value_type __t;
|
||||
typename _UniqueAssociativeContainer::value_type *__first, *__last;
|
||||
};
|
||||
|
||||
template <class _MultipleAssociativeContainer>
|
||||
struct _MultipleAssociativeContainerConcept
|
||||
{
|
||||
void __constraints() {
|
||||
__function_requires<
|
||||
_AssociativeContainerConcept<_MultipleAssociativeContainer> >();
|
||||
|
||||
_MultipleAssociativeContainer __c(__first, __last);
|
||||
|
||||
__pos = __c.insert(__t);
|
||||
__c.insert(__first, __last);
|
||||
|
||||
}
|
||||
typename _MultipleAssociativeContainer::iterator __pos _IsUnused;
|
||||
typename _MultipleAssociativeContainer::value_type __t;
|
||||
typename _MultipleAssociativeContainer::value_type *__first, *__last;
|
||||
};
|
||||
|
||||
template <class _SimpleAssociativeContainer>
|
||||
struct _SimpleAssociativeContainerConcept
|
||||
{
|
||||
void __constraints() {
|
||||
__function_requires<
|
||||
_AssociativeContainerConcept<_SimpleAssociativeContainer> >();
|
||||
typedef typename _SimpleAssociativeContainer::key_type _Key_type;
|
||||
typedef typename _SimpleAssociativeContainer::value_type _Value_type;
|
||||
typedef typename _Aux_require_same<_Key_type, _Value_type>::_Type
|
||||
_Required;
|
||||
}
|
||||
};
|
||||
|
||||
template <class _SimpleAssociativeContainer>
|
||||
struct _PairAssociativeContainerConcept
|
||||
{
|
||||
void __constraints() {
|
||||
__function_requires<
|
||||
_AssociativeContainerConcept<_SimpleAssociativeContainer> >();
|
||||
typedef typename _SimpleAssociativeContainer::key_type _Key_type;
|
||||
typedef typename _SimpleAssociativeContainer::value_type _Value_type;
|
||||
typedef typename _SimpleAssociativeContainer::mapped_type _Mapped_type;
|
||||
typedef std::pair<const _Key_type, _Mapped_type> _Required_value_type;
|
||||
typedef typename _Aux_require_same<_Value_type,
|
||||
_Required_value_type>::_Type _Required;
|
||||
}
|
||||
};
|
||||
|
||||
template <class _SortedAssociativeContainer>
|
||||
struct _SortedAssociativeContainerConcept
|
||||
{
|
||||
void __constraints() {
|
||||
__function_requires<
|
||||
_AssociativeContainerConcept<_SortedAssociativeContainer> >();
|
||||
__function_requires<
|
||||
_ReversibleContainerConcept<_SortedAssociativeContainer> >();
|
||||
|
||||
_SortedAssociativeContainer
|
||||
__c(__kc) _IsUnused,
|
||||
__c2(__first, __last) _IsUnused,
|
||||
__c3(__first, __last, __kc) _IsUnused;
|
||||
|
||||
__p = __c.upper_bound(__k);
|
||||
__p = __c.lower_bound(__k);
|
||||
__r = __c.equal_range(__k);
|
||||
|
||||
__c.insert(__p, __t);
|
||||
}
|
||||
void __const_constraints(const _SortedAssociativeContainer& __c) {
|
||||
__kc = __c.key_comp();
|
||||
__vc = __c.value_comp();
|
||||
|
||||
__cp = __c.upper_bound(__k);
|
||||
__cp = __c.lower_bound(__k);
|
||||
__cr = __c.equal_range(__k);
|
||||
}
|
||||
typename _SortedAssociativeContainer::key_compare __kc;
|
||||
typename _SortedAssociativeContainer::value_compare __vc;
|
||||
typename _SortedAssociativeContainer::value_type __t;
|
||||
typename _SortedAssociativeContainer::key_type __k;
|
||||
typedef typename _SortedAssociativeContainer::iterator _Iterator;
|
||||
typedef typename _SortedAssociativeContainer::const_iterator
|
||||
_Const_iterator;
|
||||
|
||||
_Iterator __p;
|
||||
_Const_iterator __cp;
|
||||
std::pair<_Iterator,_Iterator> __r;
|
||||
std::pair<_Const_iterator,_Const_iterator> __cr;
|
||||
typename _SortedAssociativeContainer::value_type *__first, *__last;
|
||||
};
|
||||
|
||||
// HashedAssociativeContainer
|
||||
|
||||
} // namespace __gnu_cxx
|
||||
|
||||
#undef _IsUnused
|
||||
|
||||
#endif // _GLIBCXX_BOOST_CONCEPT_CHECK
|
||||
|
||||
|
||||
@ -0,0 +1,378 @@
|
||||
// Character Traits for use by standard string and iostream -*- C++ -*-
|
||||
|
||||
// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003
|
||||
// Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 2, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING. If not, write to the Free
|
||||
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
// USA.
|
||||
|
||||
// As a special exception, you may use this file as part of a free software
|
||||
// library without restriction. Specifically, if other files instantiate
|
||||
// templates or use macros or inline functions from this file, or you compile
|
||||
// this file and link it with other files to produce an executable, this
|
||||
// file does not by itself cause the resulting executable to be covered by
|
||||
// the GNU General Public License. This exception does not however
|
||||
// invalidate any other reasons why the executable file might be covered by
|
||||
// the GNU General Public License.
|
||||
|
||||
//
|
||||
// ISO C++ 14882: 21 Strings library
|
||||
//
|
||||
|
||||
/** @file char_traits.h
|
||||
* This is an internal header file, included by other library headers.
|
||||
* You should not attempt to use it directly.
|
||||
*/
|
||||
|
||||
#ifndef _CHAR_TRAITS_H
|
||||
#define _CHAR_TRAITS_H 1
|
||||
|
||||
#pragma GCC system_header
|
||||
|
||||
#include <cstring> // For memmove, memset, memchr
|
||||
#include <bits/stl_algobase.h>// For copy, lexicographical_compare, fill_n
|
||||
#include <bits/postypes.h> // For streampos
|
||||
|
||||
namespace __gnu_cxx
|
||||
{
|
||||
/**
|
||||
* @brief Mapping from character type to associated types.
|
||||
*
|
||||
*
|
||||
* @note This is an implementation class for the generic version
|
||||
* of char_traits. It defines int_type, off_type, pos_type, and
|
||||
* state_type. By default these are unsigned long, streamoff,
|
||||
* streampos, and mbstate_t. Users who need a different set of
|
||||
* types, but who don't need to change the definitions of any function
|
||||
* defined in char_traits, can specialize __gnu_cxx::_Char_types
|
||||
* while leaving __gnu_cxx::char_traits alone. */
|
||||
template <class _CharT>
|
||||
struct _Char_types
|
||||
{
|
||||
typedef unsigned long int_type;
|
||||
typedef std::streampos pos_type;
|
||||
typedef std::streamoff off_type;
|
||||
typedef std::mbstate_t state_type;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* @brief Base class used to implement std::char_traits.
|
||||
*
|
||||
* @note For any given actual character type, this definition is
|
||||
* probably wrong. (Most of the member functions are likely to be
|
||||
* right, but the int_type and state_type typedefs, and the eof()
|
||||
* member function, are likely to be wrong.) The reason this class
|
||||
* exists is so users can specialize it. Classes in namespace std
|
||||
* may not be specialized for fundamentl types, but classes in
|
||||
* namespace __gnu_cxx may be.
|
||||
*
|
||||
* See http://gcc.gnu.org/onlinedocs/libstdc++/21_strings/howto.html#5
|
||||
* for advice on how to make use of this class for "unusual" character
|
||||
* types. Also, check out include/ext/pod_char_traits.h. */
|
||||
template<typename _CharT>
|
||||
struct char_traits
|
||||
{
|
||||
typedef _CharT char_type;
|
||||
typedef typename _Char_types<_CharT>::int_type int_type;
|
||||
typedef typename _Char_types<_CharT>::pos_type pos_type;
|
||||
typedef typename _Char_types<_CharT>::off_type off_type;
|
||||
typedef typename _Char_types<_CharT>::state_type state_type;
|
||||
|
||||
static void
|
||||
assign(char_type& __c1, const char_type& __c2)
|
||||
{ __c1 = __c2; }
|
||||
|
||||
static bool
|
||||
eq(const char_type& __c1, const char_type& __c2)
|
||||
{ return __c1 == __c2; }
|
||||
|
||||
static bool
|
||||
lt(const char_type& __c1, const char_type& __c2)
|
||||
{ return __c1 < __c2; }
|
||||
|
||||
static int
|
||||
compare(const char_type* __s1, const char_type* __s2, std::size_t __n);
|
||||
|
||||
static std::size_t
|
||||
length(const char_type* __s);
|
||||
|
||||
static const char_type*
|
||||
find(const char_type* __s, std::size_t __n, const char_type& __a);
|
||||
|
||||
static char_type*
|
||||
move(char_type* __s1, const char_type* __s2, std::size_t __n);
|
||||
|
||||
static char_type*
|
||||
copy(char_type* __s1, const char_type* __s2, std::size_t __n);
|
||||
|
||||
static char_type*
|
||||
assign(char_type* __s, std::size_t __n, char_type __a);
|
||||
|
||||
static char_type
|
||||
to_char_type(const int_type& __c)
|
||||
{ return static_cast<char_type>(__c); }
|
||||
|
||||
static int_type
|
||||
to_int_type(const char_type& __c)
|
||||
{ return static_cast<int_type>(__c); }
|
||||
|
||||
static bool
|
||||
eq_int_type(const int_type& __c1, const int_type& __c2)
|
||||
{ return __c1 == __c2; }
|
||||
|
||||
static int_type
|
||||
eof()
|
||||
{ return static_cast<int_type>(EOF); }
|
||||
|
||||
static int_type
|
||||
not_eof(const int_type& __c)
|
||||
{ return !eq_int_type(__c, eof()) ? __c : to_int_type(char_type()); }
|
||||
};
|
||||
|
||||
template<typename _CharT>
|
||||
int
|
||||
char_traits<_CharT>::
|
||||
compare(const char_type* __s1, const char_type* __s2, std::size_t __n)
|
||||
{
|
||||
for (size_t __i = 0; __i < __n; ++__i)
|
||||
if (lt(__s1[__i], __s2[__i]))
|
||||
return -1;
|
||||
else if (lt(__s2[__i], __s1[__i]))
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
template<typename _CharT>
|
||||
std::size_t
|
||||
char_traits<_CharT>::
|
||||
length(const char_type* __p)
|
||||
{
|
||||
std::size_t __i = 0;
|
||||
while (!eq(__p[__i], char_type()))
|
||||
++__i;
|
||||
return __i;
|
||||
}
|
||||
|
||||
template<typename _CharT>
|
||||
const typename char_traits<_CharT>::char_type*
|
||||
char_traits<_CharT>::
|
||||
find(const char_type* __s, std::size_t __n, const char_type& __a)
|
||||
{
|
||||
for (std::size_t __i = 0; __i < __n; ++__i)
|
||||
if (eq(__s[__i], __a))
|
||||
return __s + __i;
|
||||
return 0;
|
||||
}
|
||||
|
||||
template<typename _CharT>
|
||||
typename char_traits<_CharT>::char_type*
|
||||
char_traits<_CharT>::
|
||||
move(char_type* __s1, const char_type* __s2, std::size_t __n)
|
||||
{
|
||||
return static_cast<_CharT*>(std::memmove(__s1, __s2,
|
||||
__n * sizeof(char_type)));
|
||||
}
|
||||
|
||||
template<typename _CharT>
|
||||
typename char_traits<_CharT>::char_type*
|
||||
char_traits<_CharT>::
|
||||
copy(char_type* __s1, const char_type* __s2, std::size_t __n)
|
||||
{
|
||||
std::copy(__s2, __s2 + __n, __s1);
|
||||
return __s1;
|
||||
}
|
||||
|
||||
template<typename _CharT>
|
||||
typename char_traits<_CharT>::char_type*
|
||||
char_traits<_CharT>::
|
||||
assign(char_type* __s, std::size_t __n, char_type __a)
|
||||
{
|
||||
std::fill_n(__s, __n, __a);
|
||||
return __s;
|
||||
}
|
||||
}
|
||||
|
||||
namespace std
|
||||
{
|
||||
// 21.1
|
||||
/**
|
||||
* @brief Basis for explicit traits specializations.
|
||||
*
|
||||
* @note For any given actual character type, this definition is
|
||||
* probably wrong. Since this is just a thin wrapper around
|
||||
* __gnu_cxx::char_traits, it is possible to achieve a more
|
||||
* appropriate definition by specializing __gnu_cxx::char_traits.
|
||||
*
|
||||
* See http://gcc.gnu.org/onlinedocs/libstdc++/21_strings/howto.html#5
|
||||
* for advice on how to make use of this class for "unusual" character
|
||||
* types. Also, check out include/ext/pod_char_traits.h.
|
||||
*/
|
||||
template<class _CharT>
|
||||
struct char_traits
|
||||
: public __gnu_cxx::char_traits<_CharT>
|
||||
{ };
|
||||
|
||||
|
||||
/// 21.1.3.1 char_traits specializations
|
||||
template<>
|
||||
struct char_traits<char>
|
||||
{
|
||||
typedef char char_type;
|
||||
typedef int int_type;
|
||||
typedef streampos pos_type;
|
||||
typedef streamoff off_type;
|
||||
typedef mbstate_t state_type;
|
||||
|
||||
static void
|
||||
assign(char_type& __c1, const char_type& __c2)
|
||||
{ __c1 = __c2; }
|
||||
|
||||
static bool
|
||||
eq(const char_type& __c1, const char_type& __c2)
|
||||
{ return __c1 == __c2; }
|
||||
|
||||
static bool
|
||||
lt(const char_type& __c1, const char_type& __c2)
|
||||
{ return __c1 < __c2; }
|
||||
|
||||
static int
|
||||
compare(const char_type* __s1, const char_type* __s2, size_t __n)
|
||||
{ return memcmp(__s1, __s2, __n); }
|
||||
|
||||
static size_t
|
||||
length(const char_type* __s)
|
||||
{ return strlen(__s); }
|
||||
|
||||
static const char_type*
|
||||
find(const char_type* __s, size_t __n, const char_type& __a)
|
||||
{ return static_cast<const char_type*>(memchr(__s, __a, __n)); }
|
||||
|
||||
static char_type*
|
||||
move(char_type* __s1, const char_type* __s2, size_t __n)
|
||||
{ return static_cast<char_type*>(memmove(__s1, __s2, __n)); }
|
||||
|
||||
static char_type*
|
||||
copy(char_type* __s1, const char_type* __s2, size_t __n)
|
||||
{ return static_cast<char_type*>(memcpy(__s1, __s2, __n)); }
|
||||
|
||||
static char_type*
|
||||
assign(char_type* __s, size_t __n, char_type __a)
|
||||
{ return static_cast<char_type*>(memset(__s, __a, __n)); }
|
||||
|
||||
static char_type
|
||||
to_char_type(const int_type& __c)
|
||||
{ return static_cast<char_type>(__c); }
|
||||
|
||||
// To keep both the byte 0xff and the eof symbol 0xffffffff
|
||||
// from ending up as 0xffffffff.
|
||||
static int_type
|
||||
to_int_type(const char_type& __c)
|
||||
{ return static_cast<int_type>(static_cast<unsigned char>(__c)); }
|
||||
|
||||
static bool
|
||||
eq_int_type(const int_type& __c1, const int_type& __c2)
|
||||
{ return __c1 == __c2; }
|
||||
|
||||
static int_type
|
||||
eof() { return static_cast<int_type>(EOF); }
|
||||
|
||||
static int_type
|
||||
not_eof(const int_type& __c)
|
||||
{ return (__c == eof()) ? 0 : __c; }
|
||||
};
|
||||
|
||||
|
||||
#if defined (_GLIBCXX_USE_WCHAR_T) || defined (_GLIBCXX_USE_WSTRING)
|
||||
/// 21.1.3.2 char_traits specializations
|
||||
template<>
|
||||
struct char_traits<wchar_t>
|
||||
{
|
||||
typedef wchar_t char_type;
|
||||
typedef wint_t int_type;
|
||||
typedef streamoff off_type;
|
||||
#if defined (_GLIBCXX_USE_WCHAR_T)
|
||||
typedef wstreampos pos_type;
|
||||
typedef mbstate_t state_type;
|
||||
#endif
|
||||
|
||||
static void
|
||||
assign(char_type& __c1, const char_type& __c2)
|
||||
{ __c1 = __c2; }
|
||||
|
||||
static bool
|
||||
eq(const char_type& __c1, const char_type& __c2)
|
||||
{ return __c1 == __c2; }
|
||||
|
||||
static bool
|
||||
lt(const char_type& __c1, const char_type& __c2)
|
||||
{ return __c1 < __c2; }
|
||||
|
||||
static int
|
||||
compare(const char_type* __s1, const char_type* __s2, size_t __n)
|
||||
{ return wmemcmp(__s1, __s2, __n); }
|
||||
|
||||
static size_t
|
||||
length(const char_type* __s)
|
||||
{ return wcslen(__s); }
|
||||
|
||||
static const char_type*
|
||||
find(const char_type* __s, size_t __n, const char_type& __a)
|
||||
{ return wmemchr(__s, __a, __n); }
|
||||
|
||||
static char_type*
|
||||
move(char_type* __s1, const char_type* __s2, size_t __n)
|
||||
{ return wmemmove(__s1, __s2, __n); }
|
||||
|
||||
static char_type*
|
||||
copy(char_type* __s1, const char_type* __s2, size_t __n)
|
||||
{ return wmemcpy(__s1, __s2, __n); }
|
||||
|
||||
static char_type*
|
||||
assign(char_type* __s, size_t __n, char_type __a)
|
||||
{ return wmemset(__s, __a, __n); }
|
||||
|
||||
static char_type
|
||||
to_char_type(const int_type& __c) { return char_type(__c); }
|
||||
|
||||
static int_type
|
||||
to_int_type(const char_type& __c) { return int_type(__c); }
|
||||
|
||||
static bool
|
||||
eq_int_type(const int_type& __c1, const int_type& __c2)
|
||||
{ return __c1 == __c2; }
|
||||
|
||||
static int_type
|
||||
eof() { return static_cast<int_type>(WEOF); }
|
||||
|
||||
static int_type
|
||||
not_eof(const int_type& __c)
|
||||
{ return eq_int_type(__c, eof()) ? 0 : __c; }
|
||||
};
|
||||
#endif //_GLIBCXX_USE_WCHAR_T
|
||||
|
||||
template<typename _CharT, typename _Traits>
|
||||
struct _Char_traits_match
|
||||
{
|
||||
_CharT _M_c;
|
||||
_Char_traits_match(_CharT const& __c) : _M_c(__c) { }
|
||||
|
||||
bool
|
||||
operator()(_CharT const& __a) { return _Traits::eq(_M_c, __a); }
|
||||
};
|
||||
} // namespace std
|
||||
|
||||
#endif
|
||||
@ -0,0 +1,54 @@
|
||||
// -*- C++ -*- C math library.
|
||||
|
||||
// Copyright (C) 2000, 2003, 2004 Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 2, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING. If not, write to the Free
|
||||
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
// USA.
|
||||
|
||||
// As a special exception, you may use this file as part of a free software
|
||||
// library without restriction. Specifically, if other files instantiate
|
||||
// templates or use macros or inline functions from this file, or you compile
|
||||
// this file and link it with other files to produce an executable, this
|
||||
// file does not by itself cause the resulting executable to be covered by
|
||||
// the GNU General Public License. This exception does not however
|
||||
// invalidate any other reasons why the executable file might be covered by
|
||||
// the GNU General Public License.
|
||||
|
||||
// This file was written by Gabriel Dos Reis <gdr@codesourcery.com>
|
||||
|
||||
#ifndef _GLIBCXX_CMATH_TCC
|
||||
#define _GLIBCXX_CMATH_TCC 1
|
||||
|
||||
namespace std
|
||||
{
|
||||
template<typename _Tp>
|
||||
inline _Tp
|
||||
__cmath_power(_Tp __x, unsigned int __n)
|
||||
{
|
||||
_Tp __y = __n % 2 ? __x : 1;
|
||||
|
||||
while (__n >>= 1)
|
||||
{
|
||||
__x = __x * __x;
|
||||
if (__n % 2)
|
||||
__y = __y * __x;
|
||||
}
|
||||
|
||||
return __y;
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
@ -0,0 +1,478 @@
|
||||
// Locale support (codecvt) -*- C++ -*-
|
||||
|
||||
// Copyright (C) 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 2, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING. If not, write to the Free
|
||||
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
// USA.
|
||||
|
||||
// As a special exception, you may use this file as part of a free software
|
||||
// library without restriction. Specifically, if other files instantiate
|
||||
// templates or use macros or inline functions from this file, or you compile
|
||||
// this file and link it with other files to produce an executable, this
|
||||
// file does not by itself cause the resulting executable to be covered by
|
||||
// the GNU General Public License. This exception does not however
|
||||
// invalidate any other reasons why the executable file might be covered by
|
||||
// the GNU General Public License.
|
||||
|
||||
//
|
||||
// ISO C++ 14882: 22.2.1.5 Template class codecvt
|
||||
//
|
||||
|
||||
// Written by Benjamin Kosnik <bkoz@cygnus.com>
|
||||
|
||||
/** @file codecvt.h
|
||||
* This is an internal header file, included by other library headers.
|
||||
* You should not attempt to use it directly.
|
||||
*/
|
||||
|
||||
#ifndef _CODECVT_H
|
||||
#define _CODECVT_H 1
|
||||
|
||||
#pragma GCC system_header
|
||||
|
||||
// 22.2.1.5 Template class codecvt
|
||||
/// Base class for codecvt facet providing conversion result enum.
|
||||
class codecvt_base
|
||||
{
|
||||
public:
|
||||
enum result
|
||||
{
|
||||
ok,
|
||||
partial,
|
||||
error,
|
||||
noconv
|
||||
};
|
||||
};
|
||||
|
||||
// Template class __codecvt_abstract_base
|
||||
// NB: An abstract base class that fills in the public inlines, so
|
||||
// that the specializations don't have to re-copy the public
|
||||
// interface.
|
||||
/**
|
||||
* @brief Common base for codecvt facet
|
||||
*
|
||||
* This template class provides implementations of the public functions
|
||||
* that forward to the protected virtual functions.
|
||||
*
|
||||
* This template also provides abstract stubs for the protected virtual
|
||||
* functions.
|
||||
*/
|
||||
template<typename _InternT, typename _ExternT, typename _StateT>
|
||||
class __codecvt_abstract_base
|
||||
: public locale::facet, public codecvt_base
|
||||
{
|
||||
public:
|
||||
// Types:
|
||||
typedef codecvt_base::result result;
|
||||
typedef _InternT intern_type;
|
||||
typedef _ExternT extern_type;
|
||||
typedef _StateT state_type;
|
||||
|
||||
// 22.2.1.5.1 codecvt members
|
||||
/**
|
||||
* @brief Convert from internal to external character set.
|
||||
*
|
||||
* Converts input string of intern_type to output string of
|
||||
* extern_type. This is analogous to wcsrtombs. It does this by
|
||||
* calling codecvt::do_out.
|
||||
*
|
||||
* The source and destination character sets are determined by the
|
||||
* facet's locale, internal and external types.
|
||||
*
|
||||
* The characters in [from,from_end) are converted and written to
|
||||
* [to,to_end). from_next and to_next are set to point to the
|
||||
* character following the last successfully converted character,
|
||||
* respectively. If the result needed no conversion, from_next and
|
||||
* to_next are not affected.
|
||||
*
|
||||
* The @a state argument should be intialized if the input is at the
|
||||
* beginning and carried from a previous call if continuing
|
||||
* conversion. There are no guarantees about how @a state is used.
|
||||
*
|
||||
* The result returned is a member of codecvt_base::result. If all the
|
||||
* input is converted, returns codecvt_base::ok. If no conversion is
|
||||
* necessary, returns codecvt_base::noconv. If the input ends early or
|
||||
* there is insufficient space in the output, returns codecvt_base::partial.
|
||||
* Otherwise the conversion failed and codecvt_base::error is returned.
|
||||
*
|
||||
* @param state Persistent conversion state data.
|
||||
* @param from Start of input.
|
||||
* @param from_end End of input.
|
||||
* @param from_next Returns start of unconverted data.
|
||||
* @param to Start of output buffer.
|
||||
* @param to_end End of output buffer.
|
||||
* @param to_next Returns start of unused output area.
|
||||
* @return codecvt_base::result.
|
||||
*/
|
||||
result
|
||||
out(state_type& __state, const intern_type* __from,
|
||||
const intern_type* __from_end, const intern_type*& __from_next,
|
||||
extern_type* __to, extern_type* __to_end,
|
||||
extern_type*& __to_next) const
|
||||
{
|
||||
return this->do_out(__state, __from, __from_end, __from_next,
|
||||
__to, __to_end, __to_next);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Reset conversion state.
|
||||
*
|
||||
* Writes characters to output that would restore @a state to initial
|
||||
* conditions. The idea is that if a partial conversion occurs, then
|
||||
* the converting the characters written by this function would leave
|
||||
* the state in initial conditions, rather than partial conversion
|
||||
* state. It does this by calling codecvt::do_unshift().
|
||||
*
|
||||
* For example, if 4 external characters always converted to 1 internal
|
||||
* character, and input to in() had 6 external characters with state
|
||||
* saved, this function would write two characters to the output and
|
||||
* set the state to initialized conditions.
|
||||
*
|
||||
* The source and destination character sets are determined by the
|
||||
* facet's locale, internal and external types.
|
||||
*
|
||||
* The result returned is a member of codecvt_base::result. If the
|
||||
* state could be reset and data written, returns codecvt_base::ok. If
|
||||
* no conversion is necessary, returns codecvt_base::noconv. If the
|
||||
* output has insufficient space, returns codecvt_base::partial.
|
||||
* Otherwise the reset failed and codecvt_base::error is returned.
|
||||
*
|
||||
* @param state Persistent conversion state data.
|
||||
* @param to Start of output buffer.
|
||||
* @param to_end End of output buffer.
|
||||
* @param to_next Returns start of unused output area.
|
||||
* @return codecvt_base::result.
|
||||
*/
|
||||
result
|
||||
unshift(state_type& __state, extern_type* __to, extern_type* __to_end,
|
||||
extern_type*& __to_next) const
|
||||
{ return this->do_unshift(__state, __to,__to_end,__to_next); }
|
||||
|
||||
/**
|
||||
* @brief Convert from external to internal character set.
|
||||
*
|
||||
* Converts input string of extern_type to output string of
|
||||
* intern_type. This is analogous to mbsrtowcs. It does this by
|
||||
* calling codecvt::do_in.
|
||||
*
|
||||
* The source and destination character sets are determined by the
|
||||
* facet's locale, internal and external types.
|
||||
*
|
||||
* The characters in [from,from_end) are converted and written to
|
||||
* [to,to_end). from_next and to_next are set to point to the
|
||||
* character following the last successfully converted character,
|
||||
* respectively. If the result needed no conversion, from_next and
|
||||
* to_next are not affected.
|
||||
*
|
||||
* The @a state argument should be intialized if the input is at the
|
||||
* beginning and carried from a previous call if continuing
|
||||
* conversion. There are no guarantees about how @a state is used.
|
||||
*
|
||||
* The result returned is a member of codecvt_base::result. If all the
|
||||
* input is converted, returns codecvt_base::ok. If no conversion is
|
||||
* necessary, returns codecvt_base::noconv. If the input ends early or
|
||||
* there is insufficient space in the output, returns codecvt_base::partial.
|
||||
* Otherwise the conversion failed and codecvt_base::error is returned.
|
||||
*
|
||||
* @param state Persistent conversion state data.
|
||||
* @param from Start of input.
|
||||
* @param from_end End of input.
|
||||
* @param from_next Returns start of unconverted data.
|
||||
* @param to Start of output buffer.
|
||||
* @param to_end End of output buffer.
|
||||
* @param to_next Returns start of unused output area.
|
||||
* @return codecvt_base::result.
|
||||
*/
|
||||
result
|
||||
in(state_type& __state, const extern_type* __from,
|
||||
const extern_type* __from_end, const extern_type*& __from_next,
|
||||
intern_type* __to, intern_type* __to_end,
|
||||
intern_type*& __to_next) const
|
||||
{
|
||||
return this->do_in(__state, __from, __from_end, __from_next,
|
||||
__to, __to_end, __to_next);
|
||||
}
|
||||
|
||||
int
|
||||
encoding() const throw()
|
||||
{ return this->do_encoding(); }
|
||||
|
||||
bool
|
||||
always_noconv() const throw()
|
||||
{ return this->do_always_noconv(); }
|
||||
|
||||
int
|
||||
length(state_type& __state, const extern_type* __from,
|
||||
const extern_type* __end, size_t __max) const
|
||||
{ return this->do_length(__state, __from, __end, __max); }
|
||||
|
||||
int
|
||||
max_length() const throw()
|
||||
{ return this->do_max_length(); }
|
||||
|
||||
protected:
|
||||
explicit
|
||||
__codecvt_abstract_base(size_t __refs = 0) : locale::facet(__refs) { }
|
||||
|
||||
virtual
|
||||
~__codecvt_abstract_base() { }
|
||||
|
||||
/**
|
||||
* @brief Convert from internal to external character set.
|
||||
*
|
||||
* Converts input string of intern_type to output string of
|
||||
* extern_type. This function is a hook for derived classes to change
|
||||
* the value returned. @see out for more information.
|
||||
*/
|
||||
virtual result
|
||||
do_out(state_type& __state, const intern_type* __from,
|
||||
const intern_type* __from_end, const intern_type*& __from_next,
|
||||
extern_type* __to, extern_type* __to_end,
|
||||
extern_type*& __to_next) const = 0;
|
||||
|
||||
virtual result
|
||||
do_unshift(state_type& __state, extern_type* __to,
|
||||
extern_type* __to_end, extern_type*& __to_next) const = 0;
|
||||
|
||||
virtual result
|
||||
do_in(state_type& __state, const extern_type* __from,
|
||||
const extern_type* __from_end, const extern_type*& __from_next,
|
||||
intern_type* __to, intern_type* __to_end,
|
||||
intern_type*& __to_next) const = 0;
|
||||
|
||||
virtual int
|
||||
do_encoding() const throw() = 0;
|
||||
|
||||
virtual bool
|
||||
do_always_noconv() const throw() = 0;
|
||||
|
||||
virtual int
|
||||
do_length(state_type&, const extern_type* __from,
|
||||
const extern_type* __end, size_t __max) const = 0;
|
||||
|
||||
virtual int
|
||||
do_max_length() const throw() = 0;
|
||||
};
|
||||
|
||||
// 22.2.1.5 Template class codecvt
|
||||
// NB: Generic, mostly useless implementation.
|
||||
template<typename _InternT, typename _ExternT, typename _StateT>
|
||||
class codecvt
|
||||
: public __codecvt_abstract_base<_InternT, _ExternT, _StateT>
|
||||
{
|
||||
public:
|
||||
// Types:
|
||||
typedef codecvt_base::result result;
|
||||
typedef _InternT intern_type;
|
||||
typedef _ExternT extern_type;
|
||||
typedef _StateT state_type;
|
||||
|
||||
protected:
|
||||
__c_locale _M_c_locale_codecvt;
|
||||
|
||||
public:
|
||||
static locale::id id;
|
||||
|
||||
explicit
|
||||
codecvt(size_t __refs = 0)
|
||||
: __codecvt_abstract_base<_InternT, _ExternT, _StateT> (__refs) { }
|
||||
|
||||
explicit
|
||||
codecvt(__c_locale __cloc, size_t __refs = 0);
|
||||
|
||||
protected:
|
||||
virtual
|
||||
~codecvt() { }
|
||||
|
||||
virtual result
|
||||
do_out(state_type& __state, const intern_type* __from,
|
||||
const intern_type* __from_end, const intern_type*& __from_next,
|
||||
extern_type* __to, extern_type* __to_end,
|
||||
extern_type*& __to_next) const;
|
||||
|
||||
virtual result
|
||||
do_unshift(state_type& __state, extern_type* __to,
|
||||
extern_type* __to_end, extern_type*& __to_next) const;
|
||||
|
||||
virtual result
|
||||
do_in(state_type& __state, const extern_type* __from,
|
||||
const extern_type* __from_end, const extern_type*& __from_next,
|
||||
intern_type* __to, intern_type* __to_end,
|
||||
intern_type*& __to_next) const;
|
||||
|
||||
virtual int
|
||||
do_encoding() const throw();
|
||||
|
||||
virtual bool
|
||||
do_always_noconv() const throw();
|
||||
|
||||
virtual int
|
||||
do_length(state_type&, const extern_type* __from,
|
||||
const extern_type* __end, size_t __max) const;
|
||||
|
||||
virtual int
|
||||
do_max_length() const throw();
|
||||
};
|
||||
|
||||
template<typename _InternT, typename _ExternT, typename _StateT>
|
||||
locale::id codecvt<_InternT, _ExternT, _StateT>::id;
|
||||
|
||||
// codecvt<char, char, mbstate_t> required specialization
|
||||
template<>
|
||||
class codecvt<char, char, mbstate_t>
|
||||
: public __codecvt_abstract_base<char, char, mbstate_t>
|
||||
{
|
||||
public:
|
||||
// Types:
|
||||
typedef char intern_type;
|
||||
typedef char extern_type;
|
||||
typedef mbstate_t state_type;
|
||||
|
||||
protected:
|
||||
__c_locale _M_c_locale_codecvt;
|
||||
|
||||
public:
|
||||
static locale::id id;
|
||||
|
||||
explicit
|
||||
codecvt(size_t __refs = 0);
|
||||
|
||||
explicit
|
||||
codecvt(__c_locale __cloc, size_t __refs = 0);
|
||||
|
||||
protected:
|
||||
virtual
|
||||
~codecvt();
|
||||
|
||||
virtual result
|
||||
do_out(state_type& __state, const intern_type* __from,
|
||||
const intern_type* __from_end, const intern_type*& __from_next,
|
||||
extern_type* __to, extern_type* __to_end,
|
||||
extern_type*& __to_next) const;
|
||||
|
||||
virtual result
|
||||
do_unshift(state_type& __state, extern_type* __to,
|
||||
extern_type* __to_end, extern_type*& __to_next) const;
|
||||
|
||||
virtual result
|
||||
do_in(state_type& __state, const extern_type* __from,
|
||||
const extern_type* __from_end, const extern_type*& __from_next,
|
||||
intern_type* __to, intern_type* __to_end,
|
||||
intern_type*& __to_next) const;
|
||||
|
||||
virtual int
|
||||
do_encoding() const throw();
|
||||
|
||||
virtual bool
|
||||
do_always_noconv() const throw();
|
||||
|
||||
virtual int
|
||||
do_length(state_type&, const extern_type* __from,
|
||||
const extern_type* __end, size_t __max) const;
|
||||
|
||||
virtual int
|
||||
do_max_length() const throw();
|
||||
};
|
||||
|
||||
#ifdef _GLIBCXX_USE_WCHAR_T
|
||||
// codecvt<wchar_t, char, mbstate_t> required specialization
|
||||
template<>
|
||||
class codecvt<wchar_t, char, mbstate_t>
|
||||
: public __codecvt_abstract_base<wchar_t, char, mbstate_t>
|
||||
{
|
||||
public:
|
||||
// Types:
|
||||
typedef wchar_t intern_type;
|
||||
typedef char extern_type;
|
||||
typedef mbstate_t state_type;
|
||||
|
||||
protected:
|
||||
__c_locale _M_c_locale_codecvt;
|
||||
|
||||
public:
|
||||
static locale::id id;
|
||||
|
||||
explicit
|
||||
codecvt(size_t __refs = 0);
|
||||
|
||||
explicit
|
||||
codecvt(__c_locale __cloc, size_t __refs = 0);
|
||||
|
||||
protected:
|
||||
virtual
|
||||
~codecvt();
|
||||
|
||||
virtual result
|
||||
do_out(state_type& __state, const intern_type* __from,
|
||||
const intern_type* __from_end, const intern_type*& __from_next,
|
||||
extern_type* __to, extern_type* __to_end,
|
||||
extern_type*& __to_next) const;
|
||||
|
||||
virtual result
|
||||
do_unshift(state_type& __state,
|
||||
extern_type* __to, extern_type* __to_end,
|
||||
extern_type*& __to_next) const;
|
||||
|
||||
virtual result
|
||||
do_in(state_type& __state,
|
||||
const extern_type* __from, const extern_type* __from_end,
|
||||
const extern_type*& __from_next,
|
||||
intern_type* __to, intern_type* __to_end,
|
||||
intern_type*& __to_next) const;
|
||||
|
||||
virtual
|
||||
int do_encoding() const throw();
|
||||
|
||||
virtual
|
||||
bool do_always_noconv() const throw();
|
||||
|
||||
virtual
|
||||
int do_length(state_type&, const extern_type* __from,
|
||||
const extern_type* __end, size_t __max) const;
|
||||
|
||||
virtual int
|
||||
do_max_length() const throw();
|
||||
};
|
||||
#endif //_GLIBCXX_USE_WCHAR_T
|
||||
|
||||
// 22.2.1.6 Template class codecvt_byname
|
||||
template<typename _InternT, typename _ExternT, typename _StateT>
|
||||
class codecvt_byname : public codecvt<_InternT, _ExternT, _StateT>
|
||||
{
|
||||
public:
|
||||
explicit
|
||||
codecvt_byname(const char* __s, size_t __refs = 0)
|
||||
: codecvt<_InternT, _ExternT, _StateT>(__refs)
|
||||
{
|
||||
if (std::strcmp(__s, "C") != 0 && std::strcmp(__s, "POSIX") != 0)
|
||||
{
|
||||
_S_destroy_c_locale(this->_M_c_locale_codecvt);
|
||||
_S_create_c_locale(this->_M_c_locale_codecvt, __s);
|
||||
}
|
||||
}
|
||||
|
||||
protected:
|
||||
virtual
|
||||
~codecvt_byname() { }
|
||||
};
|
||||
|
||||
// Include host and configuration specific partial specializations
|
||||
// with additional functionality, if possible.
|
||||
#ifdef _GLIBCXX_USE_WCHAR_T
|
||||
#include <bits/codecvt_specializations.h>
|
||||
#endif
|
||||
|
||||
#endif // _CODECVT_H
|
||||
@ -0,0 +1,85 @@
|
||||
// Concept-checking control -*- C++ -*-
|
||||
|
||||
// Copyright (C) 2001 Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 2, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING. If not, write to the Free
|
||||
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
// USA.
|
||||
|
||||
// As a special exception, you may use this file as part of a free software
|
||||
// library without restriction. Specifically, if other files instantiate
|
||||
// templates or use macros or inline functions from this file, or you compile
|
||||
// this file and link it with other files to produce an executable, this
|
||||
// file does not by itself cause the resulting executable to be covered by
|
||||
// the GNU General Public License. This exception does not however
|
||||
// invalidate any other reasons why the executable file might be covered by
|
||||
// the GNU General Public License.
|
||||
|
||||
/** @file concept_check.h
|
||||
* This is an internal header file, included by other library headers.
|
||||
* You should not attempt to use it directly.
|
||||
*/
|
||||
|
||||
#ifndef _CONCEPT_CHECK_H
|
||||
#define _CONCEPT_CHECK_H 1
|
||||
|
||||
#pragma GCC system_header
|
||||
|
||||
#include <bits/c++config.h>
|
||||
|
||||
// All places in libstdc++-v3 where these are used, or /might/ be used, or
|
||||
// don't need to be used, or perhaps /should/ be used, are commented with
|
||||
// "concept requirements" (and maybe some more text). So grep like crazy
|
||||
// if you're looking for additional places to use these.
|
||||
|
||||
// Concept-checking code is off by default unless users turn it on via
|
||||
// configure options or editing c++config.h.
|
||||
|
||||
#ifndef _GLIBCXX_CONCEPT_CHECKS
|
||||
|
||||
#define __glibcxx_function_requires(...)
|
||||
#define __glibcxx_class_requires(_a,_b)
|
||||
#define __glibcxx_class_requires2(_a,_b,_c)
|
||||
#define __glibcxx_class_requires3(_a,_b,_c,_d)
|
||||
#define __glibcxx_class_requires4(_a,_b,_c,_d,_e)
|
||||
|
||||
#else // the checks are on
|
||||
|
||||
#include <bits/boost_concept_check.h>
|
||||
|
||||
// Note that the obvious and elegant approach of
|
||||
//
|
||||
//#define glibcxx_function_requires(C) boost::function_requires< boost::C >()
|
||||
//
|
||||
// won't work due to concept templates with more than one parameter, e.g.,
|
||||
// BinaryPredicateConcept. The preprocessor tries to split things up on
|
||||
// the commas in the template argument list. We can't use an inner pair of
|
||||
// parenthesis to hide the commas, because "boost::(Temp<Foo,Bar>)" isn't
|
||||
// a valid instantiation pattern. Thus, we steal a feature from C99.
|
||||
|
||||
#define __glibcxx_function_requires(...) \
|
||||
__gnu_cxx::__function_requires< __gnu_cxx::__VA_ARGS__ >();
|
||||
#define __glibcxx_class_requires(_a,_C) \
|
||||
_GLIBCXX_CLASS_REQUIRES(_a, __gnu_cxx, _C);
|
||||
#define __glibcxx_class_requires2(_a,_b,_C) \
|
||||
_GLIBCXX_CLASS_REQUIRES2(_a, _b, __gnu_cxx, _C);
|
||||
#define __glibcxx_class_requires3(_a,_b,_c,_C) \
|
||||
_GLIBCXX_CLASS_REQUIRES3(_a, _b, _c, __gnu_cxx, _C);
|
||||
#define __glibcxx_class_requires4(_a,_b,_c,_d,_C) \
|
||||
_GLIBCXX_CLASS_REQUIRES4(_a, _b, _c, _d, __gnu_cxx, _C);
|
||||
|
||||
#endif // enable/disable
|
||||
|
||||
#endif // _GLIBCXX_CONCEPT_CHECK
|
||||
@ -0,0 +1,65 @@
|
||||
// Support for concurrent programing -*- C++ -*-
|
||||
|
||||
// Copyright (C) 2003, 2004
|
||||
// Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 2, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING. If not, write to the Free
|
||||
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
// USA.
|
||||
|
||||
// As a special exception, you may use this file as part of a free software
|
||||
// library without restriction. Specifically, if other files instantiate
|
||||
// templates or use macros or inline functions from this file, or you compile
|
||||
// this file and link it with other files to produce an executable, this
|
||||
// file does not by itself cause the resulting executable to be covered by
|
||||
// the GNU General Public License. This exception does not however
|
||||
// invalidate any other reasons why the executable file might be covered by
|
||||
// the GNU General Public License.
|
||||
|
||||
#ifndef _CONCURRENCE_H
|
||||
#define _CONCURRENCE_H 1
|
||||
|
||||
// GCC's thread abstraction layer
|
||||
#include "bits/gthr.h"
|
||||
|
||||
#if __GTHREADS
|
||||
|
||||
# ifdef __GTHREAD_MUTEX_INIT
|
||||
# define __glibcxx_mutex_define_initialized(NAME) \
|
||||
__gthread_mutex_t NAME = __GTHREAD_MUTEX_INIT
|
||||
# define __glibcxx_mutex_lock(NAME) \
|
||||
__gthread_mutex_lock(&NAME)
|
||||
# else
|
||||
// Implies __GTHREAD_MUTEX_INIT_FUNCTION
|
||||
# define __glibcxx_mutex_define_initialized(NAME) \
|
||||
__gthread_mutex_t NAME; \
|
||||
__gthread_once_t NAME ## _once = __GTHREAD_ONCE_INIT; \
|
||||
void NAME ## _init() { __GTHREAD_MUTEX_INIT_FUNCTION(&NAME); }
|
||||
# define __glibcxx_mutex_lock(NAME) \
|
||||
__gthread_once(&NAME ## _once, NAME ## _init); \
|
||||
__gthread_mutex_lock(&NAME)
|
||||
# endif
|
||||
|
||||
# define __glibcxx_mutex_unlock(NAME) __gthread_mutex_unlock(&NAME)
|
||||
|
||||
#else
|
||||
|
||||
# define __glibcxx_mutex_define_initialized(NAME)
|
||||
# define __glibcxx_mutex_lock(NAME)
|
||||
# define __glibcxx_mutex_unlock(NAME)
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@ -0,0 +1,347 @@
|
||||
// The -*- C++ -*- type traits classes for internal use in libstdc++
|
||||
|
||||
// Copyright (C) 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 2, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING. If not, write to the Free
|
||||
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
// USA.
|
||||
|
||||
// As a special exception, you may use this file as part of a free software
|
||||
// library without restriction. Specifically, if other files instantiate
|
||||
// templates or use macros or inline functions from this file, or you compile
|
||||
// this file and link it with other files to produce an executable, this
|
||||
// file does not by itself cause the resulting executable to be covered by
|
||||
// the GNU General Public License. This exception does not however
|
||||
// invalidate any other reasons why the executable file might be covered by
|
||||
// the GNU General Public License.
|
||||
|
||||
// Written by Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
|
||||
|
||||
/** @file cpp_type_traits.h
|
||||
* This is an internal header file, included by other library headers.
|
||||
* You should not attempt to use it directly.
|
||||
*/
|
||||
|
||||
#ifndef _CPP_TYPE_TRAITS_H
|
||||
#define _CPP_TYPE_TRAITS_H 1
|
||||
|
||||
#pragma GCC system_header
|
||||
|
||||
//
|
||||
// This file provides some compile-time information about various types.
|
||||
// These representations were designed, on purpose, to be constant-expressions
|
||||
// and not types as found in <stl/bits/type_traits.h>. In particular, they
|
||||
// can be used in control structures and the optimizer hopefully will do
|
||||
// the obvious thing.
|
||||
//
|
||||
// Why integral expressions, and not functions nor types?
|
||||
// Firstly, these compile-time entities are used as template-arguments
|
||||
// so function return values won't work: We need compile-time entities.
|
||||
// We're left with types and constant integral expressions.
|
||||
// Secondly, from the point of view of ease of use, type-based compile-time
|
||||
// information is -not- *that* convenient. On has to write lots of
|
||||
// overloaded functions and to hope that the compiler will select the right
|
||||
// one. As a net effect, the overall structure isn't very clear at first
|
||||
// glance.
|
||||
// Thirdly, partial ordering and overload resolution (of function templates)
|
||||
// is highly costly in terms of compiler-resource. It is a Good Thing to
|
||||
// keep these resource consumption as least as possible.
|
||||
//
|
||||
// See valarray_array.h for a case use.
|
||||
//
|
||||
// -- Gaby (dosreis@cmla.ens-cachan.fr) 2000-03-06.
|
||||
//
|
||||
|
||||
namespace std
|
||||
{
|
||||
// Compare for equality of types.
|
||||
template<typename, typename>
|
||||
struct __are_same
|
||||
{
|
||||
enum
|
||||
{
|
||||
_M_type = 0
|
||||
};
|
||||
};
|
||||
|
||||
template<typename _Tp>
|
||||
struct __are_same<_Tp, _Tp>
|
||||
{
|
||||
enum
|
||||
{
|
||||
_M_type = 1
|
||||
};
|
||||
};
|
||||
|
||||
// Define a nested type if some predicate holds.
|
||||
template<typename, bool>
|
||||
struct __enable_if
|
||||
{
|
||||
};
|
||||
|
||||
template<typename _Tp>
|
||||
struct __enable_if<_Tp, true>
|
||||
{
|
||||
typedef _Tp _M_type;
|
||||
};
|
||||
|
||||
// Holds if the template-argument is a void type.
|
||||
template<typename _Tp>
|
||||
struct __is_void
|
||||
{
|
||||
enum
|
||||
{
|
||||
_M_type = 0
|
||||
};
|
||||
};
|
||||
|
||||
template<>
|
||||
struct __is_void<void>
|
||||
{
|
||||
enum
|
||||
{
|
||||
_M_type = 1
|
||||
};
|
||||
};
|
||||
|
||||
//
|
||||
// Integer types
|
||||
//
|
||||
template<typename _Tp>
|
||||
struct __is_integer
|
||||
{
|
||||
enum
|
||||
{
|
||||
_M_type = 0
|
||||
};
|
||||
};
|
||||
|
||||
// Thirteen specializations (yes there are eleven standard integer
|
||||
// types; 'long long' and 'unsigned long long' are supported as
|
||||
// extensions)
|
||||
template<>
|
||||
struct __is_integer<bool>
|
||||
{
|
||||
enum
|
||||
{
|
||||
_M_type = 1
|
||||
};
|
||||
};
|
||||
|
||||
template<>
|
||||
struct __is_integer<char>
|
||||
{
|
||||
enum
|
||||
{
|
||||
_M_type = 1
|
||||
};
|
||||
};
|
||||
|
||||
template<>
|
||||
struct __is_integer<signed char>
|
||||
{
|
||||
enum
|
||||
{
|
||||
_M_type = 1
|
||||
};
|
||||
};
|
||||
|
||||
template<>
|
||||
struct __is_integer<unsigned char>
|
||||
{
|
||||
enum
|
||||
{
|
||||
_M_type = 1
|
||||
};
|
||||
};
|
||||
|
||||
# ifdef _GLIBCXX_USE_WCHAR_T
|
||||
template<>
|
||||
struct __is_integer<wchar_t>
|
||||
{
|
||||
enum
|
||||
{
|
||||
_M_type = 1
|
||||
};
|
||||
};
|
||||
# endif
|
||||
|
||||
template<>
|
||||
struct __is_integer<short>
|
||||
{
|
||||
enum
|
||||
{
|
||||
_M_type = 1
|
||||
};
|
||||
};
|
||||
|
||||
template<>
|
||||
struct __is_integer<unsigned short>
|
||||
{
|
||||
enum
|
||||
{
|
||||
_M_type = 1
|
||||
};
|
||||
};
|
||||
|
||||
template<>
|
||||
struct __is_integer<int>
|
||||
{
|
||||
enum
|
||||
{
|
||||
_M_type = 1
|
||||
};
|
||||
};
|
||||
|
||||
template<>
|
||||
struct __is_integer<unsigned int>
|
||||
{
|
||||
enum
|
||||
{
|
||||
_M_type = 1
|
||||
};
|
||||
};
|
||||
|
||||
template<>
|
||||
struct __is_integer<long>
|
||||
{
|
||||
enum
|
||||
{
|
||||
_M_type = 1
|
||||
};
|
||||
};
|
||||
|
||||
template<>
|
||||
struct __is_integer<unsigned long>
|
||||
{
|
||||
enum
|
||||
{
|
||||
_M_type = 1
|
||||
};
|
||||
};
|
||||
|
||||
template<>
|
||||
struct __is_integer<long long>
|
||||
{
|
||||
enum
|
||||
{
|
||||
_M_type = 1
|
||||
};
|
||||
};
|
||||
|
||||
template<>
|
||||
struct __is_integer<unsigned long long>
|
||||
{
|
||||
enum
|
||||
{
|
||||
_M_type = 1
|
||||
};
|
||||
};
|
||||
|
||||
//
|
||||
// Floating point types
|
||||
//
|
||||
template<typename _Tp>
|
||||
struct __is_floating
|
||||
{
|
||||
enum
|
||||
{
|
||||
_M_type = 0
|
||||
};
|
||||
};
|
||||
|
||||
// three specializations (float, double and 'long double')
|
||||
template<>
|
||||
struct __is_floating<float>
|
||||
{
|
||||
enum
|
||||
{
|
||||
_M_type = 1
|
||||
};
|
||||
};
|
||||
|
||||
template<>
|
||||
struct __is_floating<double>
|
||||
{
|
||||
enum
|
||||
{
|
||||
_M_type = 1
|
||||
};
|
||||
};
|
||||
|
||||
template<>
|
||||
struct __is_floating<long double>
|
||||
{
|
||||
enum
|
||||
{
|
||||
_M_type = 1
|
||||
};
|
||||
};
|
||||
|
||||
//
|
||||
// An arithmetic type is an integer type or a floating point type
|
||||
//
|
||||
template<typename _Tp>
|
||||
struct __is_arithmetic
|
||||
{
|
||||
enum
|
||||
{
|
||||
_M_type = __is_integer<_Tp>::_M_type || __is_floating<_Tp>::_M_type
|
||||
};
|
||||
};
|
||||
|
||||
//
|
||||
// A fundamental type is `void' or and arithmetic type
|
||||
//
|
||||
template<typename _Tp>
|
||||
struct __is_fundamental
|
||||
{
|
||||
enum
|
||||
{
|
||||
_M_type = __is_void<_Tp>::_M_type || __is_arithmetic<_Tp>::_M_type
|
||||
};
|
||||
};
|
||||
|
||||
//
|
||||
// For the immediate use, the following is a good approximation
|
||||
//
|
||||
|
||||
// NB: g++ can not compile these if declared within the class
|
||||
// __is_pod itself.
|
||||
namespace __gnu_internal
|
||||
{
|
||||
typedef char __one;
|
||||
typedef char __two[2];
|
||||
|
||||
template <typename _Tp>
|
||||
__one __test_type (int _Tp::*);
|
||||
template <typename _Tp>
|
||||
__two& __test_type (...);
|
||||
}
|
||||
|
||||
|
||||
template<typename _Tp>
|
||||
struct __is_pod
|
||||
{
|
||||
enum
|
||||
{
|
||||
_M_type = (sizeof(__gnu_internal::__test_type<_Tp>(0)) != sizeof(__gnu_internal::__one))
|
||||
};
|
||||
};
|
||||
|
||||
} // namespace std
|
||||
|
||||
|
||||
#endif //_CPP_TYPE_TRAITS_H
|
||||
@ -0,0 +1,719 @@
|
||||
// Deque implementation (out of line) -*- C++ -*-
|
||||
|
||||
// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 2, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING. If not, write to the Free
|
||||
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
// USA.
|
||||
|
||||
// As a special exception, you may use this file as part of a free software
|
||||
// library without restriction. Specifically, if other files instantiate
|
||||
// templates or use macros or inline functions from this file, or you compile
|
||||
// this file and link it with other files to produce an executable, this
|
||||
// file does not by itself cause the resulting executable to be covered by
|
||||
// the GNU General Public License. This exception does not however
|
||||
// invalidate any other reasons why the executable file might be covered by
|
||||
// the GNU General Public License.
|
||||
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 1994
|
||||
* Hewlett-Packard Company
|
||||
*
|
||||
* Permission to use, copy, modify, distribute and sell this software
|
||||
* and its documentation for any purpose is hereby granted without fee,
|
||||
* provided that the above copyright notice appear in all copies and
|
||||
* that both that copyright notice and this permission notice appear
|
||||
* in supporting documentation. Hewlett-Packard Company makes no
|
||||
* representations about the suitability of this software for any
|
||||
* purpose. It is provided "as is" without express or implied warranty.
|
||||
*
|
||||
*
|
||||
* Copyright (c) 1997
|
||||
* Silicon Graphics Computer Systems, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, distribute and sell this software
|
||||
* and its documentation for any purpose is hereby granted without fee,
|
||||
* provided that the above copyright notice appear in all copies and
|
||||
* that both that copyright notice and this permission notice appear
|
||||
* in supporting documentation. Silicon Graphics makes no
|
||||
* representations about the suitability of this software for any
|
||||
* purpose. It is provided "as is" without express or implied warranty.
|
||||
*/
|
||||
|
||||
/** @file deque.tcc
|
||||
* This is an internal header file, included by other library headers.
|
||||
* You should not attempt to use it directly.
|
||||
*/
|
||||
|
||||
#ifndef _DEQUE_TCC
|
||||
#define _DEQUE_TCC 1
|
||||
|
||||
namespace _GLIBCXX_STD
|
||||
{
|
||||
template <typename _Tp, typename _Alloc>
|
||||
deque<_Tp,_Alloc>&
|
||||
deque<_Tp,_Alloc>::
|
||||
operator=(const deque& __x)
|
||||
{
|
||||
const size_type __len = size();
|
||||
if (&__x != this)
|
||||
{
|
||||
if (__len >= __x.size())
|
||||
erase(std::copy(__x.begin(), __x.end(), this->_M_impl._M_start),
|
||||
this->_M_impl._M_finish);
|
||||
else
|
||||
{
|
||||
const_iterator __mid = __x.begin() + difference_type(__len);
|
||||
std::copy(__x.begin(), __mid, this->_M_impl._M_start);
|
||||
insert(this->_M_impl._M_finish, __mid, __x.end());
|
||||
}
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
template <typename _Tp, typename _Alloc>
|
||||
typename deque<_Tp,_Alloc>::iterator
|
||||
deque<_Tp,_Alloc>::
|
||||
insert(iterator position, const value_type& __x)
|
||||
{
|
||||
if (position._M_cur == this->_M_impl._M_start._M_cur)
|
||||
{
|
||||
push_front(__x);
|
||||
return this->_M_impl._M_start;
|
||||
}
|
||||
else if (position._M_cur == this->_M_impl._M_finish._M_cur)
|
||||
{
|
||||
push_back(__x);
|
||||
iterator __tmp = this->_M_impl._M_finish;
|
||||
--__tmp;
|
||||
return __tmp;
|
||||
}
|
||||
else
|
||||
return _M_insert_aux(position, __x);
|
||||
}
|
||||
|
||||
template <typename _Tp, typename _Alloc>
|
||||
typename deque<_Tp,_Alloc>::iterator
|
||||
deque<_Tp,_Alloc>::
|
||||
erase(iterator __position)
|
||||
{
|
||||
iterator __next = __position;
|
||||
++__next;
|
||||
size_type __index = __position - this->_M_impl._M_start;
|
||||
if (__index < (size() >> 1))
|
||||
{
|
||||
std::copy_backward(this->_M_impl._M_start, __position, __next);
|
||||
pop_front();
|
||||
}
|
||||
else
|
||||
{
|
||||
std::copy(__next, this->_M_impl._M_finish, __position);
|
||||
pop_back();
|
||||
}
|
||||
return this->_M_impl._M_start + __index;
|
||||
}
|
||||
|
||||
template <typename _Tp, typename _Alloc>
|
||||
typename deque<_Tp,_Alloc>::iterator
|
||||
deque<_Tp,_Alloc>::
|
||||
erase(iterator __first, iterator __last)
|
||||
{
|
||||
if (__first == this->_M_impl._M_start && __last == this->_M_impl._M_finish)
|
||||
{
|
||||
clear();
|
||||
return this->_M_impl._M_finish;
|
||||
}
|
||||
else
|
||||
{
|
||||
const difference_type __n = __last - __first;
|
||||
const difference_type __elems_before = __first - this->_M_impl._M_start;
|
||||
if (static_cast<size_type>(__elems_before) < (size() - __n) / 2)
|
||||
{
|
||||
std::copy_backward(this->_M_impl._M_start, __first, __last);
|
||||
iterator __new_start = this->_M_impl._M_start + __n;
|
||||
std::_Destroy(this->_M_impl._M_start, __new_start);
|
||||
_M_destroy_nodes(this->_M_impl._M_start._M_node, __new_start._M_node);
|
||||
this->_M_impl._M_start = __new_start;
|
||||
}
|
||||
else
|
||||
{
|
||||
std::copy(__last, this->_M_impl._M_finish, __first);
|
||||
iterator __new_finish = this->_M_impl._M_finish - __n;
|
||||
std::_Destroy(__new_finish, this->_M_impl._M_finish);
|
||||
_M_destroy_nodes(__new_finish._M_node + 1,
|
||||
this->_M_impl._M_finish._M_node + 1);
|
||||
this->_M_impl._M_finish = __new_finish;
|
||||
}
|
||||
return this->_M_impl._M_start + __elems_before;
|
||||
}
|
||||
}
|
||||
|
||||
template <typename _Tp, typename _Alloc>
|
||||
void
|
||||
deque<_Tp,_Alloc>::
|
||||
clear()
|
||||
{
|
||||
for (_Map_pointer __node = this->_M_impl._M_start._M_node + 1;
|
||||
__node < this->_M_impl._M_finish._M_node;
|
||||
++__node)
|
||||
{
|
||||
std::_Destroy(*__node, *__node + _S_buffer_size());
|
||||
_M_deallocate_node(*__node);
|
||||
}
|
||||
|
||||
if (this->_M_impl._M_start._M_node != this->_M_impl._M_finish._M_node)
|
||||
{
|
||||
std::_Destroy(this->_M_impl._M_start._M_cur, this->_M_impl._M_start._M_last);
|
||||
std::_Destroy(this->_M_impl._M_finish._M_first, this->_M_impl._M_finish._M_cur);
|
||||
_M_deallocate_node(this->_M_impl._M_finish._M_first);
|
||||
}
|
||||
else
|
||||
std::_Destroy(this->_M_impl._M_start._M_cur, this->_M_impl._M_finish._M_cur);
|
||||
|
||||
this->_M_impl._M_finish = this->_M_impl._M_start;
|
||||
}
|
||||
|
||||
template <typename _Tp, class _Alloc>
|
||||
template <typename _InputIterator>
|
||||
void
|
||||
deque<_Tp,_Alloc>
|
||||
::_M_assign_aux(_InputIterator __first, _InputIterator __last,
|
||||
input_iterator_tag)
|
||||
{
|
||||
iterator __cur = begin();
|
||||
for ( ; __first != __last && __cur != end(); ++__cur, ++__first)
|
||||
*__cur = *__first;
|
||||
if (__first == __last)
|
||||
erase(__cur, end());
|
||||
else
|
||||
insert(end(), __first, __last);
|
||||
}
|
||||
|
||||
template <typename _Tp, typename _Alloc>
|
||||
void
|
||||
deque<_Tp,_Alloc>::
|
||||
_M_fill_insert(iterator __pos, size_type __n, const value_type& __x)
|
||||
{
|
||||
if (__pos._M_cur == this->_M_impl._M_start._M_cur)
|
||||
{
|
||||
iterator __new_start = _M_reserve_elements_at_front(__n);
|
||||
try
|
||||
{
|
||||
std::uninitialized_fill(__new_start, this->_M_impl._M_start, __x);
|
||||
this->_M_impl._M_start = __new_start;
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
_M_destroy_nodes(__new_start._M_node, this->_M_impl._M_start._M_node);
|
||||
__throw_exception_again;
|
||||
}
|
||||
}
|
||||
else if (__pos._M_cur == this->_M_impl._M_finish._M_cur)
|
||||
{
|
||||
iterator __new_finish = _M_reserve_elements_at_back(__n);
|
||||
try
|
||||
{
|
||||
std::uninitialized_fill(this->_M_impl._M_finish, __new_finish, __x);
|
||||
this->_M_impl._M_finish = __new_finish;
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
_M_destroy_nodes(this->_M_impl._M_finish._M_node + 1,
|
||||
__new_finish._M_node + 1);
|
||||
__throw_exception_again;
|
||||
}
|
||||
}
|
||||
else
|
||||
_M_insert_aux(__pos, __n, __x);
|
||||
}
|
||||
|
||||
template <typename _Tp, typename _Alloc>
|
||||
void
|
||||
deque<_Tp,_Alloc>::
|
||||
_M_fill_initialize(const value_type& __value)
|
||||
{
|
||||
_Map_pointer __cur;
|
||||
try
|
||||
{
|
||||
for (__cur = this->_M_impl._M_start._M_node;
|
||||
__cur < this->_M_impl._M_finish._M_node;
|
||||
++__cur)
|
||||
std::uninitialized_fill(*__cur, *__cur + _S_buffer_size(), __value);
|
||||
std::uninitialized_fill(this->_M_impl._M_finish._M_first,
|
||||
this->_M_impl._M_finish._M_cur,
|
||||
__value);
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
std::_Destroy(this->_M_impl._M_start, iterator(*__cur, __cur));
|
||||
__throw_exception_again;
|
||||
}
|
||||
}
|
||||
|
||||
template <typename _Tp, typename _Alloc>
|
||||
template <typename _InputIterator>
|
||||
void
|
||||
deque<_Tp,_Alloc>::
|
||||
_M_range_initialize(_InputIterator __first, _InputIterator __last,
|
||||
input_iterator_tag)
|
||||
{
|
||||
this->_M_initialize_map(0);
|
||||
try
|
||||
{
|
||||
for ( ; __first != __last; ++__first)
|
||||
push_back(*__first);
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
clear();
|
||||
__throw_exception_again;
|
||||
}
|
||||
}
|
||||
|
||||
template <typename _Tp, typename _Alloc>
|
||||
template <typename _ForwardIterator>
|
||||
void
|
||||
deque<_Tp,_Alloc>::
|
||||
_M_range_initialize(_ForwardIterator __first, _ForwardIterator __last,
|
||||
forward_iterator_tag)
|
||||
{
|
||||
const size_type __n = std::distance(__first, __last);
|
||||
this->_M_initialize_map(__n);
|
||||
|
||||
_Map_pointer __cur_node;
|
||||
try
|
||||
{
|
||||
for (__cur_node = this->_M_impl._M_start._M_node;
|
||||
__cur_node < this->_M_impl._M_finish._M_node;
|
||||
++__cur_node)
|
||||
{
|
||||
_ForwardIterator __mid = __first;
|
||||
std::advance(__mid, _S_buffer_size());
|
||||
std::uninitialized_copy(__first, __mid, *__cur_node);
|
||||
__first = __mid;
|
||||
}
|
||||
std::uninitialized_copy(__first, __last, this->_M_impl._M_finish._M_first);
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
std::_Destroy(this->_M_impl._M_start, iterator(*__cur_node, __cur_node));
|
||||
__throw_exception_again;
|
||||
}
|
||||
}
|
||||
|
||||
// Called only if _M_impl._M_finish._M_cur == _M_impl._M_finish._M_last - 1.
|
||||
template <typename _Tp, typename _Alloc>
|
||||
void
|
||||
deque<_Tp,_Alloc>::
|
||||
_M_push_back_aux(const value_type& __t)
|
||||
{
|
||||
value_type __t_copy = __t;
|
||||
_M_reserve_map_at_back();
|
||||
*(this->_M_impl._M_finish._M_node + 1) = this->_M_allocate_node();
|
||||
try
|
||||
{
|
||||
std::_Construct(this->_M_impl._M_finish._M_cur, __t_copy);
|
||||
this->_M_impl._M_finish._M_set_node(this->_M_impl._M_finish._M_node + 1);
|
||||
this->_M_impl._M_finish._M_cur = this->_M_impl._M_finish._M_first;
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
_M_deallocate_node(*(this->_M_impl._M_finish._M_node + 1));
|
||||
__throw_exception_again;
|
||||
}
|
||||
}
|
||||
|
||||
// Called only if _M_impl._M_start._M_cur == _M_impl._M_start._M_first.
|
||||
template <typename _Tp, typename _Alloc>
|
||||
void
|
||||
deque<_Tp,_Alloc>::
|
||||
_M_push_front_aux(const value_type& __t)
|
||||
{
|
||||
value_type __t_copy = __t;
|
||||
_M_reserve_map_at_front();
|
||||
*(this->_M_impl._M_start._M_node - 1) = this->_M_allocate_node();
|
||||
try
|
||||
{
|
||||
this->_M_impl._M_start._M_set_node(this->_M_impl._M_start._M_node - 1);
|
||||
this->_M_impl._M_start._M_cur = this->_M_impl._M_start._M_last - 1;
|
||||
std::_Construct(this->_M_impl._M_start._M_cur, __t_copy);
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
++this->_M_impl._M_start;
|
||||
_M_deallocate_node(*(this->_M_impl._M_start._M_node - 1));
|
||||
__throw_exception_again;
|
||||
}
|
||||
}
|
||||
|
||||
// Called only if _M_impl._M_finish._M_cur == _M_impl._M_finish._M_first.
|
||||
template <typename _Tp, typename _Alloc>
|
||||
void deque<_Tp,_Alloc>::
|
||||
_M_pop_back_aux()
|
||||
{
|
||||
_M_deallocate_node(this->_M_impl._M_finish._M_first);
|
||||
this->_M_impl._M_finish._M_set_node(this->_M_impl._M_finish._M_node - 1);
|
||||
this->_M_impl._M_finish._M_cur = this->_M_impl._M_finish._M_last - 1;
|
||||
std::_Destroy(this->_M_impl._M_finish._M_cur);
|
||||
}
|
||||
|
||||
// Called only if _M_impl._M_start._M_cur == _M_impl._M_start._M_last - 1. Note that
|
||||
// if the deque has at least one element (a precondition for this member
|
||||
// function), and if _M_impl._M_start._M_cur == _M_impl._M_start._M_last, then the deque
|
||||
// must have at least two nodes.
|
||||
template <typename _Tp, typename _Alloc>
|
||||
void deque<_Tp,_Alloc>::
|
||||
_M_pop_front_aux()
|
||||
{
|
||||
std::_Destroy(this->_M_impl._M_start._M_cur);
|
||||
_M_deallocate_node(this->_M_impl._M_start._M_first);
|
||||
this->_M_impl._M_start._M_set_node(this->_M_impl._M_start._M_node + 1);
|
||||
this->_M_impl._M_start._M_cur = this->_M_impl._M_start._M_first;
|
||||
}
|
||||
|
||||
template <typename _Tp, typename _Alloc>
|
||||
template <typename _InputIterator>
|
||||
void
|
||||
deque<_Tp,_Alloc>::
|
||||
_M_range_insert_aux(iterator __pos,
|
||||
_InputIterator __first, _InputIterator __last,
|
||||
input_iterator_tag)
|
||||
{ std::copy(__first, __last, std::inserter(*this, __pos)); }
|
||||
|
||||
template <typename _Tp, typename _Alloc>
|
||||
template <typename _ForwardIterator>
|
||||
void
|
||||
deque<_Tp,_Alloc>::
|
||||
_M_range_insert_aux(iterator __pos,
|
||||
_ForwardIterator __first, _ForwardIterator __last,
|
||||
forward_iterator_tag)
|
||||
{
|
||||
size_type __n = std::distance(__first, __last);
|
||||
if (__pos._M_cur == this->_M_impl._M_start._M_cur)
|
||||
{
|
||||
iterator __new_start = _M_reserve_elements_at_front(__n);
|
||||
try
|
||||
{
|
||||
std::uninitialized_copy(__first, __last, __new_start);
|
||||
this->_M_impl._M_start = __new_start;
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
_M_destroy_nodes(__new_start._M_node, this->_M_impl._M_start._M_node);
|
||||
__throw_exception_again;
|
||||
}
|
||||
}
|
||||
else if (__pos._M_cur == this->_M_impl._M_finish._M_cur)
|
||||
{
|
||||
iterator __new_finish = _M_reserve_elements_at_back(__n);
|
||||
try
|
||||
{
|
||||
std::uninitialized_copy(__first, __last, this->_M_impl._M_finish);
|
||||
this->_M_impl._M_finish = __new_finish;
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
_M_destroy_nodes(this->_M_impl._M_finish._M_node + 1,
|
||||
__new_finish._M_node + 1);
|
||||
__throw_exception_again;
|
||||
}
|
||||
}
|
||||
else
|
||||
_M_insert_aux(__pos, __first, __last, __n);
|
||||
}
|
||||
|
||||
template <typename _Tp, typename _Alloc>
|
||||
typename deque<_Tp, _Alloc>::iterator
|
||||
deque<_Tp,_Alloc>::
|
||||
_M_insert_aux(iterator __pos, const value_type& __x)
|
||||
{
|
||||
difference_type __index = __pos - this->_M_impl._M_start;
|
||||
value_type __x_copy = __x; // XXX copy
|
||||
if (static_cast<size_type>(__index) < size() / 2)
|
||||
{
|
||||
push_front(front());
|
||||
iterator __front1 = this->_M_impl._M_start;
|
||||
++__front1;
|
||||
iterator __front2 = __front1;
|
||||
++__front2;
|
||||
__pos = this->_M_impl._M_start + __index;
|
||||
iterator __pos1 = __pos;
|
||||
++__pos1;
|
||||
std::copy(__front2, __pos1, __front1);
|
||||
}
|
||||
else
|
||||
{
|
||||
push_back(back());
|
||||
iterator __back1 = this->_M_impl._M_finish;
|
||||
--__back1;
|
||||
iterator __back2 = __back1;
|
||||
--__back2;
|
||||
__pos = this->_M_impl._M_start + __index;
|
||||
std::copy_backward(__pos, __back2, __back1);
|
||||
}
|
||||
*__pos = __x_copy;
|
||||
return __pos;
|
||||
}
|
||||
|
||||
template <typename _Tp, typename _Alloc>
|
||||
void
|
||||
deque<_Tp,_Alloc>::
|
||||
_M_insert_aux(iterator __pos, size_type __n, const value_type& __x)
|
||||
{
|
||||
const difference_type __elems_before = __pos - this->_M_impl._M_start;
|
||||
size_type __length = this->size();
|
||||
value_type __x_copy = __x;
|
||||
if (__elems_before < difference_type(__length / 2))
|
||||
{
|
||||
iterator __new_start = _M_reserve_elements_at_front(__n);
|
||||
iterator __old_start = this->_M_impl._M_start;
|
||||
__pos = this->_M_impl._M_start + __elems_before;
|
||||
try
|
||||
{
|
||||
if (__elems_before >= difference_type(__n))
|
||||
{
|
||||
iterator __start_n = this->_M_impl._M_start + difference_type(__n);
|
||||
std::uninitialized_copy(this->_M_impl._M_start, __start_n,
|
||||
__new_start);
|
||||
this->_M_impl._M_start = __new_start;
|
||||
std::copy(__start_n, __pos, __old_start);
|
||||
fill(__pos - difference_type(__n), __pos, __x_copy);
|
||||
}
|
||||
else
|
||||
{
|
||||
std::__uninitialized_copy_fill(this->_M_impl._M_start, __pos,
|
||||
__new_start,
|
||||
this->_M_impl._M_start, __x_copy);
|
||||
this->_M_impl._M_start = __new_start;
|
||||
std::fill(__old_start, __pos, __x_copy);
|
||||
}
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
_M_destroy_nodes(__new_start._M_node, this->_M_impl._M_start._M_node);
|
||||
__throw_exception_again;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
iterator __new_finish = _M_reserve_elements_at_back(__n);
|
||||
iterator __old_finish = this->_M_impl._M_finish;
|
||||
const difference_type __elems_after =
|
||||
difference_type(__length) - __elems_before;
|
||||
__pos = this->_M_impl._M_finish - __elems_after;
|
||||
try
|
||||
{
|
||||
if (__elems_after > difference_type(__n))
|
||||
{
|
||||
iterator __finish_n = this->_M_impl._M_finish - difference_type(__n);
|
||||
std::uninitialized_copy(__finish_n, this->_M_impl._M_finish,
|
||||
this->_M_impl._M_finish);
|
||||
this->_M_impl._M_finish = __new_finish;
|
||||
std::copy_backward(__pos, __finish_n, __old_finish);
|
||||
std::fill(__pos, __pos + difference_type(__n), __x_copy);
|
||||
}
|
||||
else
|
||||
{
|
||||
std::__uninitialized_fill_copy(this->_M_impl._M_finish,
|
||||
__pos + difference_type(__n),
|
||||
__x_copy, __pos,
|
||||
this->_M_impl._M_finish);
|
||||
this->_M_impl._M_finish = __new_finish;
|
||||
std::fill(__pos, __old_finish, __x_copy);
|
||||
}
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
_M_destroy_nodes(this->_M_impl._M_finish._M_node + 1,
|
||||
__new_finish._M_node + 1);
|
||||
__throw_exception_again;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
template <typename _Tp, typename _Alloc>
|
||||
template <typename _ForwardIterator>
|
||||
void
|
||||
deque<_Tp,_Alloc>::
|
||||
_M_insert_aux(iterator __pos,
|
||||
_ForwardIterator __first, _ForwardIterator __last,
|
||||
size_type __n)
|
||||
{
|
||||
const difference_type __elemsbefore = __pos - this->_M_impl._M_start;
|
||||
size_type __length = size();
|
||||
if (static_cast<size_type>(__elemsbefore) < __length / 2)
|
||||
{
|
||||
iterator __new_start = _M_reserve_elements_at_front(__n);
|
||||
iterator __old_start = this->_M_impl._M_start;
|
||||
__pos = this->_M_impl._M_start + __elemsbefore;
|
||||
try
|
||||
{
|
||||
if (__elemsbefore >= difference_type(__n))
|
||||
{
|
||||
iterator __start_n = this->_M_impl._M_start + difference_type(__n);
|
||||
std::uninitialized_copy(this->_M_impl._M_start, __start_n,
|
||||
__new_start);
|
||||
this->_M_impl._M_start = __new_start;
|
||||
std::copy(__start_n, __pos, __old_start);
|
||||
std::copy(__first, __last, __pos - difference_type(__n));
|
||||
}
|
||||
else
|
||||
{
|
||||
_ForwardIterator __mid = __first;
|
||||
std::advance(__mid, difference_type(__n) - __elemsbefore);
|
||||
std::__uninitialized_copy_copy(this->_M_impl._M_start, __pos,
|
||||
__first, __mid, __new_start);
|
||||
this->_M_impl._M_start = __new_start;
|
||||
std::copy(__mid, __last, __old_start);
|
||||
}
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
_M_destroy_nodes(__new_start._M_node, this->_M_impl._M_start._M_node);
|
||||
__throw_exception_again;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
iterator __new_finish = _M_reserve_elements_at_back(__n);
|
||||
iterator __old_finish = this->_M_impl._M_finish;
|
||||
const difference_type __elemsafter =
|
||||
difference_type(__length) - __elemsbefore;
|
||||
__pos = this->_M_impl._M_finish - __elemsafter;
|
||||
try
|
||||
{
|
||||
if (__elemsafter > difference_type(__n))
|
||||
{
|
||||
iterator __finish_n = this->_M_impl._M_finish - difference_type(__n);
|
||||
std::uninitialized_copy(__finish_n,
|
||||
this->_M_impl._M_finish,
|
||||
this->_M_impl._M_finish);
|
||||
this->_M_impl._M_finish = __new_finish;
|
||||
std::copy_backward(__pos, __finish_n, __old_finish);
|
||||
std::copy(__first, __last, __pos);
|
||||
}
|
||||
else
|
||||
{
|
||||
_ForwardIterator __mid = __first;
|
||||
std::advance(__mid, __elemsafter);
|
||||
std::__uninitialized_copy_copy(__mid, __last, __pos,
|
||||
this->_M_impl._M_finish,
|
||||
this->_M_impl._M_finish);
|
||||
this->_M_impl._M_finish = __new_finish;
|
||||
std::copy(__first, __mid, __pos);
|
||||
}
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
_M_destroy_nodes(this->_M_impl._M_finish._M_node + 1,
|
||||
__new_finish._M_node + 1);
|
||||
__throw_exception_again;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
template <typename _Tp, typename _Alloc>
|
||||
void
|
||||
deque<_Tp,_Alloc>::
|
||||
_M_new_elements_at_front(size_type __new_elems)
|
||||
{
|
||||
size_type __new_nodes
|
||||
= (__new_elems + _S_buffer_size() - 1) / _S_buffer_size();
|
||||
_M_reserve_map_at_front(__new_nodes);
|
||||
size_type __i;
|
||||
try
|
||||
{
|
||||
for (__i = 1; __i <= __new_nodes; ++__i)
|
||||
*(this->_M_impl._M_start._M_node - __i) = this->_M_allocate_node();
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
for (size_type __j = 1; __j < __i; ++__j)
|
||||
_M_deallocate_node(*(this->_M_impl._M_start._M_node - __j));
|
||||
__throw_exception_again;
|
||||
}
|
||||
}
|
||||
|
||||
template <typename _Tp, typename _Alloc>
|
||||
void
|
||||
deque<_Tp,_Alloc>::
|
||||
_M_new_elements_at_back(size_type __new_elems)
|
||||
{
|
||||
size_type __new_nodes
|
||||
= (__new_elems + _S_buffer_size() - 1) / _S_buffer_size();
|
||||
_M_reserve_map_at_back(__new_nodes);
|
||||
size_type __i;
|
||||
try
|
||||
{
|
||||
for (__i = 1; __i <= __new_nodes; ++__i)
|
||||
*(this->_M_impl._M_finish._M_node + __i) = this->_M_allocate_node();
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
for (size_type __j = 1; __j < __i; ++__j)
|
||||
_M_deallocate_node(*(this->_M_impl._M_finish._M_node + __j));
|
||||
__throw_exception_again;
|
||||
}
|
||||
}
|
||||
|
||||
template <typename _Tp, typename _Alloc>
|
||||
void
|
||||
deque<_Tp,_Alloc>::
|
||||
_M_reallocate_map(size_type __nodes_to_add, bool __add_at_front)
|
||||
{
|
||||
size_type __old_num_nodes
|
||||
= this->_M_impl._M_finish._M_node - this->_M_impl._M_start._M_node + 1;
|
||||
size_type __new_num_nodes = __old_num_nodes + __nodes_to_add;
|
||||
|
||||
_Map_pointer __new_nstart;
|
||||
if (this->_M_impl._M_map_size > 2 * __new_num_nodes)
|
||||
{
|
||||
__new_nstart = this->_M_impl._M_map + (this->_M_impl._M_map_size
|
||||
- __new_num_nodes) / 2
|
||||
+ (__add_at_front ? __nodes_to_add : 0);
|
||||
if (__new_nstart < this->_M_impl._M_start._M_node)
|
||||
std::copy(this->_M_impl._M_start._M_node,
|
||||
this->_M_impl._M_finish._M_node + 1,
|
||||
__new_nstart);
|
||||
else
|
||||
std::copy_backward(this->_M_impl._M_start._M_node,
|
||||
this->_M_impl._M_finish._M_node + 1,
|
||||
__new_nstart + __old_num_nodes);
|
||||
}
|
||||
else
|
||||
{
|
||||
size_type __new_map_size = this->_M_impl._M_map_size
|
||||
+ std::max(this->_M_impl._M_map_size,
|
||||
__nodes_to_add) + 2;
|
||||
|
||||
_Map_pointer __new_map = this->_M_allocate_map(__new_map_size);
|
||||
__new_nstart = __new_map + (__new_map_size - __new_num_nodes) / 2
|
||||
+ (__add_at_front ? __nodes_to_add : 0);
|
||||
std::copy(this->_M_impl._M_start._M_node,
|
||||
this->_M_impl._M_finish._M_node + 1,
|
||||
__new_nstart);
|
||||
_M_deallocate_map(this->_M_impl._M_map, this->_M_impl._M_map_size);
|
||||
|
||||
this->_M_impl._M_map = __new_map;
|
||||
this->_M_impl._M_map_size = __new_map_size;
|
||||
}
|
||||
|
||||
this->_M_impl._M_start._M_set_node(__new_nstart);
|
||||
this->_M_impl._M_finish._M_set_node(__new_nstart + __old_num_nodes - 1);
|
||||
}
|
||||
} // namespace std
|
||||
|
||||
#endif
|
||||
@ -0,0 +1,809 @@
|
||||
// File based streams -*- C++ -*-
|
||||
|
||||
// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
|
||||
// Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 2, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING. If not, write to the Free
|
||||
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
// USA.
|
||||
|
||||
// As a special exception, you may use this file as part of a free software
|
||||
// library without restriction. Specifically, if other files instantiate
|
||||
// templates or use macros or inline functions from this file, or you compile
|
||||
// this file and link it with other files to produce an executable, this
|
||||
// file does not by itself cause the resulting executable to be covered by
|
||||
// the GNU General Public License. This exception does not however
|
||||
// invalidate any other reasons why the executable file might be covered by
|
||||
// the GNU General Public License.
|
||||
|
||||
//
|
||||
// ISO C++ 14882: 27.8 File-based streams
|
||||
//
|
||||
|
||||
#ifndef _FSTREAM_TCC
|
||||
#define _FSTREAM_TCC 1
|
||||
|
||||
#pragma GCC system_header
|
||||
|
||||
namespace std
|
||||
{
|
||||
template<typename _CharT, typename _Traits>
|
||||
void
|
||||
basic_filebuf<_CharT, _Traits>::
|
||||
_M_allocate_internal_buffer()
|
||||
{
|
||||
// Allocate internal buffer only if one doesn't already exist
|
||||
// (either allocated or provided by the user via setbuf).
|
||||
if (!_M_buf_allocated && !this->_M_buf)
|
||||
{
|
||||
this->_M_buf = new char_type[this->_M_buf_size];
|
||||
_M_buf_allocated = true;
|
||||
}
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _Traits>
|
||||
void
|
||||
basic_filebuf<_CharT, _Traits>::
|
||||
_M_destroy_internal_buffer() throw()
|
||||
{
|
||||
if (_M_buf_allocated)
|
||||
{
|
||||
delete [] this->_M_buf;
|
||||
this->_M_buf = NULL;
|
||||
_M_buf_allocated = false;
|
||||
}
|
||||
delete [] _M_ext_buf;
|
||||
_M_ext_buf = NULL;
|
||||
_M_ext_buf_size = 0;
|
||||
_M_ext_next = NULL;
|
||||
_M_ext_end = NULL;
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _Traits>
|
||||
basic_filebuf<_CharT, _Traits>::
|
||||
basic_filebuf() : __streambuf_type(), _M_file(&_M_lock),
|
||||
_M_mode(ios_base::openmode(0)), _M_state_beg(), _M_state_cur(),
|
||||
_M_state_last(), _M_buf(NULL), _M_buf_size(BUFSIZ),
|
||||
_M_buf_allocated(false), _M_reading(false), _M_writing(false),
|
||||
_M_pback_cur_save(0), _M_pback_end_save(0), _M_pback_init(false),
|
||||
_M_codecvt(0), _M_ext_buf(0), _M_ext_buf_size(0), _M_ext_next(0),
|
||||
_M_ext_end(0)
|
||||
{
|
||||
if (has_facet<__codecvt_type>(this->_M_buf_locale))
|
||||
_M_codecvt = &use_facet<__codecvt_type>(this->_M_buf_locale);
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _Traits>
|
||||
typename basic_filebuf<_CharT, _Traits>::__filebuf_type*
|
||||
basic_filebuf<_CharT, _Traits>::
|
||||
open(const char* __s, ios_base::openmode __mode)
|
||||
{
|
||||
__filebuf_type *__ret = NULL;
|
||||
if (!this->is_open())
|
||||
{
|
||||
_M_file.open(__s, __mode);
|
||||
if (this->is_open())
|
||||
{
|
||||
_M_allocate_internal_buffer();
|
||||
this->_M_mode = __mode;
|
||||
|
||||
// Setup initial buffer to 'uncommitted' mode.
|
||||
_M_reading = false;
|
||||
_M_writing = false;
|
||||
_M_set_buffer(-1);
|
||||
|
||||
// Reset to initial state.
|
||||
_M_state_last = _M_state_cur = _M_state_beg;
|
||||
|
||||
// 27.8.1.3,4
|
||||
if ((__mode & ios_base::ate)
|
||||
&& this->seekoff(0, ios_base::end, __mode)
|
||||
== pos_type(off_type(-1)))
|
||||
this->close();
|
||||
else
|
||||
__ret = this;
|
||||
}
|
||||
}
|
||||
return __ret;
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _Traits>
|
||||
typename basic_filebuf<_CharT, _Traits>::__filebuf_type*
|
||||
basic_filebuf<_CharT, _Traits>::
|
||||
close() throw()
|
||||
{
|
||||
__filebuf_type* __ret = NULL;
|
||||
if (this->is_open())
|
||||
{
|
||||
bool __testfail = false;
|
||||
try
|
||||
{
|
||||
if (!_M_terminate_output())
|
||||
__testfail = true;
|
||||
}
|
||||
catch(...)
|
||||
{ __testfail = true; }
|
||||
|
||||
// NB: Do this here so that re-opened filebufs will be cool...
|
||||
this->_M_mode = ios_base::openmode(0);
|
||||
this->_M_pback_init = false;
|
||||
_M_destroy_internal_buffer();
|
||||
_M_reading = false;
|
||||
_M_writing = false;
|
||||
_M_set_buffer(-1);
|
||||
_M_state_last = _M_state_cur = _M_state_beg;
|
||||
|
||||
if (!_M_file.close())
|
||||
__testfail = true;
|
||||
|
||||
if (!__testfail)
|
||||
__ret = this;
|
||||
}
|
||||
return __ret;
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _Traits>
|
||||
streamsize
|
||||
basic_filebuf<_CharT, _Traits>::
|
||||
showmanyc()
|
||||
{
|
||||
streamsize __ret = -1;
|
||||
const bool __testin = this->_M_mode & ios_base::in;
|
||||
if (__testin && this->is_open())
|
||||
{
|
||||
// For a stateful encoding (-1) the pending sequence might be just
|
||||
// shift and unshift prefixes with no actual character.
|
||||
__ret = this->egptr() - this->gptr();
|
||||
if (__check_facet(_M_codecvt).encoding() >= 0)
|
||||
__ret += _M_file.showmanyc() / _M_codecvt->max_length();
|
||||
}
|
||||
return __ret;
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _Traits>
|
||||
typename basic_filebuf<_CharT, _Traits>::int_type
|
||||
basic_filebuf<_CharT, _Traits>::
|
||||
underflow()
|
||||
{
|
||||
int_type __ret = traits_type::eof();
|
||||
const bool __testin = this->_M_mode & ios_base::in;
|
||||
if (__testin && !_M_writing)
|
||||
{
|
||||
// Check for pback madness, and if so swich back to the
|
||||
// normal buffers and jet outta here before expensive
|
||||
// fileops happen...
|
||||
_M_destroy_pback();
|
||||
|
||||
if (this->gptr() < this->egptr())
|
||||
return traits_type::to_int_type(*this->gptr());
|
||||
|
||||
// Get and convert input sequence.
|
||||
const size_t __buflen = this->_M_buf_size > 1
|
||||
? this->_M_buf_size - 1 : 1;
|
||||
|
||||
// Will be set to true if ::read() returns 0 indicating EOF.
|
||||
bool __got_eof = false;
|
||||
// Number of internal characters produced.
|
||||
streamsize __ilen = 0;
|
||||
codecvt_base::result __r = codecvt_base::ok;
|
||||
if (__check_facet(_M_codecvt).always_noconv())
|
||||
{
|
||||
__ilen = _M_file.xsgetn(reinterpret_cast<char*>(this->eback()),
|
||||
__buflen);
|
||||
if (__ilen == 0)
|
||||
__got_eof = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Worst-case number of external bytes.
|
||||
// XXX Not done encoding() == -1.
|
||||
const int __enc = _M_codecvt->encoding();
|
||||
streamsize __blen; // Minimum buffer size.
|
||||
streamsize __rlen; // Number of chars to read.
|
||||
if (__enc > 0)
|
||||
__blen = __rlen = __buflen * __enc;
|
||||
else
|
||||
{
|
||||
__blen = __buflen + _M_codecvt->max_length() - 1;
|
||||
__rlen = __buflen;
|
||||
}
|
||||
const streamsize __remainder = _M_ext_end - _M_ext_next;
|
||||
__rlen = __rlen > __remainder ? __rlen - __remainder : 0;
|
||||
|
||||
// An imbue in 'read' mode implies first converting the external
|
||||
// chars already present.
|
||||
if (_M_reading && this->egptr() == this->eback() && __remainder)
|
||||
__rlen = 0;
|
||||
|
||||
// Allocate buffer if necessary and move unconverted
|
||||
// bytes to front.
|
||||
if (_M_ext_buf_size < __blen)
|
||||
{
|
||||
char* __buf = new char[__blen];
|
||||
if (__remainder)
|
||||
std::memcpy(__buf, _M_ext_next, __remainder);
|
||||
|
||||
delete [] _M_ext_buf;
|
||||
_M_ext_buf = __buf;
|
||||
_M_ext_buf_size = __blen;
|
||||
}
|
||||
else if (__remainder)
|
||||
std::memmove(_M_ext_buf, _M_ext_next, __remainder);
|
||||
|
||||
_M_ext_next = _M_ext_buf;
|
||||
_M_ext_end = _M_ext_buf + __remainder;
|
||||
_M_state_last = _M_state_cur;
|
||||
|
||||
do
|
||||
{
|
||||
if (__rlen > 0)
|
||||
{
|
||||
// Sanity check!
|
||||
// This may fail if the return value of
|
||||
// codecvt::max_length() is bogus.
|
||||
if (_M_ext_end - _M_ext_buf + __rlen > _M_ext_buf_size)
|
||||
{
|
||||
__throw_ios_failure(__N("basic_filebuf::underflow "
|
||||
"codecvt::max_length() "
|
||||
"is not valid"));
|
||||
}
|
||||
streamsize __elen = _M_file.xsgetn(_M_ext_end, __rlen);
|
||||
if (__elen == 0)
|
||||
__got_eof = true;
|
||||
else if (__elen == -1)
|
||||
break;
|
||||
_M_ext_end += __elen;
|
||||
}
|
||||
|
||||
char_type* __iend;
|
||||
__r = _M_codecvt->in(_M_state_cur, _M_ext_next,
|
||||
_M_ext_end, _M_ext_next, this->eback(),
|
||||
this->eback() + __buflen, __iend);
|
||||
if (__r == codecvt_base::noconv)
|
||||
{
|
||||
size_t __avail = _M_ext_end - _M_ext_buf;
|
||||
__ilen = std::min(__avail, __buflen);
|
||||
traits_type::copy(this->eback(),
|
||||
reinterpret_cast<char_type*>(_M_ext_buf), __ilen);
|
||||
_M_ext_next = _M_ext_buf + __ilen;
|
||||
}
|
||||
else
|
||||
__ilen = __iend - this->eback();
|
||||
|
||||
// _M_codecvt->in may return error while __ilen > 0: this is
|
||||
// ok, and actually occurs in case of mixed encodings (e.g.,
|
||||
// XML files).
|
||||
if (__r == codecvt_base::error)
|
||||
break;
|
||||
|
||||
__rlen = 1;
|
||||
}
|
||||
while (__ilen == 0 && !__got_eof);
|
||||
}
|
||||
|
||||
if (__ilen > 0)
|
||||
{
|
||||
_M_set_buffer(__ilen);
|
||||
_M_reading = true;
|
||||
__ret = traits_type::to_int_type(*this->gptr());
|
||||
}
|
||||
else if (__got_eof)
|
||||
{
|
||||
// If the actual end of file is reached, set 'uncommitted'
|
||||
// mode, thus allowing an immediate write without an
|
||||
// intervening seek.
|
||||
_M_set_buffer(-1);
|
||||
_M_reading = false;
|
||||
// However, reaching it while looping on partial means that
|
||||
// the file has got an incomplete character.
|
||||
if (__r == codecvt_base::partial)
|
||||
__throw_ios_failure(__N("basic_filebuf::underflow "
|
||||
"incomplete character in file"));
|
||||
}
|
||||
else if (__r == codecvt_base::error)
|
||||
__throw_ios_failure(__N("basic_filebuf::underflow "
|
||||
"invalid byte sequence in file"));
|
||||
else
|
||||
__throw_ios_failure(__N("basic_filebuf::underflow "
|
||||
"error reading the file"));
|
||||
}
|
||||
return __ret;
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _Traits>
|
||||
typename basic_filebuf<_CharT, _Traits>::int_type
|
||||
basic_filebuf<_CharT, _Traits>::
|
||||
pbackfail(int_type __i)
|
||||
{
|
||||
int_type __ret = traits_type::eof();
|
||||
const bool __testin = this->_M_mode & ios_base::in;
|
||||
if (__testin && !_M_writing)
|
||||
{
|
||||
// Remember whether the pback buffer is active, otherwise below
|
||||
// we may try to store in it a second char (libstdc++/9761).
|
||||
const bool __testpb = this->_M_pback_init;
|
||||
const bool __testeof = traits_type::eq_int_type(__i, __ret);
|
||||
int_type __tmp;
|
||||
if (this->eback() < this->gptr())
|
||||
{
|
||||
this->gbump(-1);
|
||||
__tmp = traits_type::to_int_type(*this->gptr());
|
||||
}
|
||||
else if (this->seekoff(-1, ios_base::cur) != pos_type(off_type(-1)))
|
||||
{
|
||||
__tmp = this->underflow();
|
||||
if (traits_type::eq_int_type(__tmp, __ret))
|
||||
return __ret;
|
||||
}
|
||||
else
|
||||
{
|
||||
// At the beginning of the buffer, need to make a
|
||||
// putback position available. But the seek may fail
|
||||
// (f.i., at the beginning of a file, see
|
||||
// libstdc++/9439) and in that case we return
|
||||
// traits_type::eof().
|
||||
return __ret;
|
||||
}
|
||||
|
||||
// Try to put back __i into input sequence in one of three ways.
|
||||
// Order these tests done in is unspecified by the standard.
|
||||
if (!__testeof && traits_type::eq_int_type(__i, __tmp))
|
||||
__ret = __i;
|
||||
else if (__testeof)
|
||||
__ret = traits_type::not_eof(__i);
|
||||
else if (!__testpb)
|
||||
{
|
||||
_M_create_pback();
|
||||
_M_reading = true;
|
||||
*this->gptr() = traits_type::to_char_type(__i);
|
||||
__ret = __i;
|
||||
}
|
||||
}
|
||||
return __ret;
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _Traits>
|
||||
typename basic_filebuf<_CharT, _Traits>::int_type
|
||||
basic_filebuf<_CharT, _Traits>::
|
||||
overflow(int_type __c)
|
||||
{
|
||||
int_type __ret = traits_type::eof();
|
||||
const bool __testeof = traits_type::eq_int_type(__c, __ret);
|
||||
const bool __testout = this->_M_mode & ios_base::out;
|
||||
if (__testout && !_M_reading)
|
||||
{
|
||||
if (this->pbase() < this->pptr())
|
||||
{
|
||||
// If appropriate, append the overflow char.
|
||||
if (!__testeof)
|
||||
{
|
||||
*this->pptr() = traits_type::to_char_type(__c);
|
||||
this->pbump(1);
|
||||
}
|
||||
|
||||
// Convert pending sequence to external representation,
|
||||
// and output.
|
||||
if (_M_convert_to_external(this->pbase(),
|
||||
this->pptr() - this->pbase())
|
||||
&& (!__testeof || !_M_file.sync()))
|
||||
{
|
||||
_M_set_buffer(0);
|
||||
__ret = traits_type::not_eof(__c);
|
||||
}
|
||||
}
|
||||
else if (this->_M_buf_size > 1)
|
||||
{
|
||||
// Overflow in 'uncommitted' mode: set _M_writing, set
|
||||
// the buffer to the initial 'write' mode, and put __c
|
||||
// into the buffer.
|
||||
_M_set_buffer(0);
|
||||
_M_writing = true;
|
||||
if (!__testeof)
|
||||
{
|
||||
*this->pptr() = traits_type::to_char_type(__c);
|
||||
this->pbump(1);
|
||||
}
|
||||
__ret = traits_type::not_eof(__c);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Unbuffered.
|
||||
char_type __conv = traits_type::to_char_type(__c);
|
||||
if (__testeof || _M_convert_to_external(&__conv, 1))
|
||||
{
|
||||
_M_writing = true;
|
||||
__ret = traits_type::not_eof(__c);
|
||||
}
|
||||
}
|
||||
}
|
||||
return __ret;
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _Traits>
|
||||
bool
|
||||
basic_filebuf<_CharT, _Traits>::
|
||||
_M_convert_to_external(_CharT* __ibuf, streamsize __ilen)
|
||||
{
|
||||
// Sizes of external and pending output.
|
||||
streamsize __elen;
|
||||
streamsize __plen;
|
||||
if (__check_facet(_M_codecvt).always_noconv())
|
||||
{
|
||||
__elen = _M_file.xsputn(reinterpret_cast<char*>(__ibuf), __ilen);
|
||||
__plen = __ilen;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Worst-case number of external bytes needed.
|
||||
// XXX Not done encoding() == -1.
|
||||
streamsize __blen = __ilen * _M_codecvt->max_length();
|
||||
char* __buf = static_cast<char*>(__builtin_alloca(__blen));
|
||||
|
||||
char* __bend;
|
||||
const char_type* __iend;
|
||||
codecvt_base::result __r;
|
||||
__r = _M_codecvt->out(_M_state_cur, __ibuf, __ibuf + __ilen,
|
||||
__iend, __buf, __buf + __blen, __bend);
|
||||
|
||||
if (__r == codecvt_base::ok || __r == codecvt_base::partial)
|
||||
__blen = __bend - __buf;
|
||||
else if (__r == codecvt_base::noconv)
|
||||
{
|
||||
// Same as the always_noconv case above.
|
||||
__buf = reinterpret_cast<char*>(__ibuf);
|
||||
__blen = __ilen;
|
||||
}
|
||||
else
|
||||
__throw_ios_failure(__N("basic_filebuf::_M_convert_to_external "
|
||||
"conversion error"));
|
||||
|
||||
__elen = _M_file.xsputn(__buf, __blen);
|
||||
__plen = __blen;
|
||||
|
||||
// Try once more for partial conversions.
|
||||
if (__r == codecvt_base::partial && __elen == __plen)
|
||||
{
|
||||
const char_type* __iresume = __iend;
|
||||
streamsize __rlen = this->pptr() - __iend;
|
||||
__r = _M_codecvt->out(_M_state_cur, __iresume,
|
||||
__iresume + __rlen, __iend, __buf,
|
||||
__buf + __blen, __bend);
|
||||
if (__r != codecvt_base::error)
|
||||
{
|
||||
__rlen = __bend - __buf;
|
||||
__elen = _M_file.xsputn(__buf, __rlen);
|
||||
__plen = __rlen;
|
||||
}
|
||||
else
|
||||
__throw_ios_failure(__N("basic_filebuf::_M_convert_to_external "
|
||||
"conversion error"));
|
||||
}
|
||||
}
|
||||
return __elen == __plen;
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _Traits>
|
||||
streamsize
|
||||
basic_filebuf<_CharT, _Traits>::
|
||||
xsputn(const _CharT* __s, streamsize __n)
|
||||
{
|
||||
// Optimization in the always_noconv() case, to be generalized in the
|
||||
// future: when __n is sufficiently large we write directly instead of
|
||||
// using the buffer.
|
||||
streamsize __ret = 0;
|
||||
const bool __testout = this->_M_mode & ios_base::out;
|
||||
if (__testout && !_M_reading
|
||||
&& __check_facet(_M_codecvt).always_noconv())
|
||||
{
|
||||
// Measurement would reveal the best choice.
|
||||
const streamsize __chunk = 1ul << 10;
|
||||
streamsize __bufavail = this->epptr() - this->pptr();
|
||||
|
||||
// Don't mistake 'uncommitted' mode buffered with unbuffered.
|
||||
if (!_M_writing && this->_M_buf_size > 1)
|
||||
__bufavail = this->_M_buf_size - 1;
|
||||
|
||||
const streamsize __limit = std::min(__chunk, __bufavail);
|
||||
if (__n >= __limit)
|
||||
{
|
||||
const streamsize __buffill = this->pptr() - this->pbase();
|
||||
const char* __buf = reinterpret_cast<const char*>(this->pbase());
|
||||
__ret = _M_file.xsputn_2(__buf, __buffill,
|
||||
reinterpret_cast<const char*>(__s),
|
||||
__n);
|
||||
if (__ret == __buffill + __n)
|
||||
{
|
||||
_M_set_buffer(0);
|
||||
_M_writing = true;
|
||||
}
|
||||
if (__ret > __buffill)
|
||||
__ret -= __buffill;
|
||||
else
|
||||
__ret = 0;
|
||||
}
|
||||
else
|
||||
__ret = __streambuf_type::xsputn(__s, __n);
|
||||
}
|
||||
else
|
||||
__ret = __streambuf_type::xsputn(__s, __n);
|
||||
return __ret;
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _Traits>
|
||||
typename basic_filebuf<_CharT, _Traits>::__streambuf_type*
|
||||
basic_filebuf<_CharT, _Traits>::
|
||||
setbuf(char_type* __s, streamsize __n)
|
||||
{
|
||||
if (!this->is_open())
|
||||
if (__s == 0 && __n == 0)
|
||||
this->_M_buf_size = 1;
|
||||
else if (__s && __n > 0)
|
||||
{
|
||||
// This is implementation-defined behavior, and assumes that
|
||||
// an external char_type array of length __n exists and has
|
||||
// been pre-allocated. If this is not the case, things will
|
||||
// quickly blow up. When __n > 1, __n - 1 positions will be
|
||||
// used for the get area, __n - 1 for the put area and 1
|
||||
// position to host the overflow char of a full put area.
|
||||
// When __n == 1, 1 position will be used for the get area
|
||||
// and 0 for the put area, as in the unbuffered case above.
|
||||
this->_M_buf = __s;
|
||||
this->_M_buf_size = __n;
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
// According to 27.8.1.4 p11 - 13, seekoff should ignore the last
|
||||
// argument (of type openmode).
|
||||
template<typename _CharT, typename _Traits>
|
||||
typename basic_filebuf<_CharT, _Traits>::pos_type
|
||||
basic_filebuf<_CharT, _Traits>::
|
||||
seekoff(off_type __off, ios_base::seekdir __way, ios_base::openmode)
|
||||
{
|
||||
int __width = 0;
|
||||
if (_M_codecvt)
|
||||
__width = _M_codecvt->encoding();
|
||||
if (__width < 0)
|
||||
__width = 0;
|
||||
|
||||
pos_type __ret = pos_type(off_type(-1));
|
||||
const bool __testfail = __off != 0 && __width <= 0;
|
||||
if (this->is_open() && !__testfail)
|
||||
{
|
||||
// Ditch any pback buffers to avoid confusion.
|
||||
_M_destroy_pback();
|
||||
|
||||
// Correct state at destination. Note that this is the correct
|
||||
// state for the current position during output, because
|
||||
// codecvt::unshift() returns the state to the initial state.
|
||||
// This is also the correct state at the end of the file because
|
||||
// an unshift sequence should have been written at the end.
|
||||
__state_type __state = _M_state_beg;
|
||||
off_type __computed_off = __off * __width;
|
||||
if (_M_reading && __way == ios_base::cur)
|
||||
{
|
||||
if (_M_codecvt->always_noconv())
|
||||
__computed_off += this->gptr() - this->egptr();
|
||||
else
|
||||
{
|
||||
// Calculate offset from _M_ext_buf that corresponds
|
||||
// to gptr(). Note: uses _M_state_last, which
|
||||
// corresponds to eback().
|
||||
const int __gptr_off =
|
||||
_M_codecvt->length(_M_state_last, _M_ext_buf, _M_ext_next,
|
||||
this->gptr() - this->eback());
|
||||
__computed_off += _M_ext_buf + __gptr_off - _M_ext_end;
|
||||
|
||||
// _M_state_last is modified by codecvt::length() so
|
||||
// it now corresponds to gptr().
|
||||
__state = _M_state_last;
|
||||
}
|
||||
}
|
||||
__ret = _M_seek(__computed_off, __way, __state);
|
||||
}
|
||||
return __ret;
|
||||
}
|
||||
|
||||
// _GLIBCXX_RESOLVE_LIB_DEFECTS
|
||||
// 171. Strange seekpos() semantics due to joint position
|
||||
// According to the resolution of DR 171, seekpos should ignore the last
|
||||
// argument (of type openmode).
|
||||
template<typename _CharT, typename _Traits>
|
||||
typename basic_filebuf<_CharT, _Traits>::pos_type
|
||||
basic_filebuf<_CharT, _Traits>::
|
||||
seekpos(pos_type __pos, ios_base::openmode)
|
||||
{
|
||||
pos_type __ret = pos_type(off_type(-1));
|
||||
if (this->is_open())
|
||||
{
|
||||
// Ditch any pback buffers to avoid confusion.
|
||||
_M_destroy_pback();
|
||||
__ret = _M_seek(off_type(__pos), ios_base::beg, __pos.state());
|
||||
}
|
||||
return __ret;
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _Traits>
|
||||
typename basic_filebuf<_CharT, _Traits>::pos_type
|
||||
basic_filebuf<_CharT, _Traits>::
|
||||
_M_seek(off_type __off, ios_base::seekdir __way, __state_type __state)
|
||||
{
|
||||
pos_type __ret = pos_type(off_type(-1));
|
||||
if (_M_terminate_output())
|
||||
{
|
||||
// Returns pos_type(off_type(-1)) in case of failure.
|
||||
__ret = pos_type(_M_file.seekoff(__off, __way));
|
||||
_M_reading = false;
|
||||
_M_writing = false;
|
||||
_M_ext_next = _M_ext_end = _M_ext_buf;
|
||||
_M_set_buffer(-1);
|
||||
_M_state_cur = __state;
|
||||
__ret.state(_M_state_cur);
|
||||
}
|
||||
return __ret;
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _Traits>
|
||||
bool
|
||||
basic_filebuf<_CharT, _Traits>::
|
||||
_M_terminate_output()
|
||||
{
|
||||
// Part one: update the output sequence.
|
||||
bool __testvalid = true;
|
||||
if (this->pbase() < this->pptr())
|
||||
{
|
||||
const int_type __tmp = this->overflow();
|
||||
if (traits_type::eq_int_type(__tmp, traits_type::eof()))
|
||||
__testvalid = false;
|
||||
}
|
||||
|
||||
// Part two: output unshift sequence.
|
||||
if (_M_writing && !__check_facet(_M_codecvt).always_noconv()
|
||||
&& __testvalid)
|
||||
{
|
||||
// Note: this value is arbitrary, since there is no way to
|
||||
// get the length of the unshift sequence from codecvt,
|
||||
// without calling unshift.
|
||||
const size_t __blen = 128;
|
||||
char __buf[__blen];
|
||||
codecvt_base::result __r;
|
||||
streamsize __ilen = 0;
|
||||
|
||||
do
|
||||
{
|
||||
char* __next;
|
||||
__r = _M_codecvt->unshift(_M_state_cur, __buf,
|
||||
__buf + __blen, __next);
|
||||
if (__r == codecvt_base::error)
|
||||
__testvalid = false;
|
||||
else if (__r == codecvt_base::ok ||
|
||||
__r == codecvt_base::partial)
|
||||
{
|
||||
__ilen = __next - __buf;
|
||||
if (__ilen > 0)
|
||||
{
|
||||
const streamsize __elen = _M_file.xsputn(__buf, __ilen);
|
||||
if (__elen != __ilen)
|
||||
__testvalid = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
while (__r == codecvt_base::partial && __ilen > 0 && __testvalid);
|
||||
|
||||
if (__testvalid)
|
||||
{
|
||||
// This second call to overflow() is required by the standard,
|
||||
// but it's not clear why it's needed, since the output buffer
|
||||
// should be empty by this point (it should have been emptied
|
||||
// in the first call to overflow()).
|
||||
const int_type __tmp = this->overflow();
|
||||
if (traits_type::eq_int_type(__tmp, traits_type::eof()))
|
||||
__testvalid = false;
|
||||
}
|
||||
}
|
||||
return __testvalid;
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _Traits>
|
||||
int
|
||||
basic_filebuf<_CharT, _Traits>::
|
||||
sync()
|
||||
{
|
||||
// Make sure that the internal buffer resyncs its idea of
|
||||
// the file position with the external file.
|
||||
// NB: _M_file.sync() will be called within.
|
||||
int __ret = 0;
|
||||
if (this->pbase() < this->pptr())
|
||||
{
|
||||
const int_type __tmp = this->overflow();
|
||||
if (traits_type::eq_int_type(__tmp, traits_type::eof()))
|
||||
__ret = -1;
|
||||
}
|
||||
return __ret;
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _Traits>
|
||||
void
|
||||
basic_filebuf<_CharT, _Traits>::
|
||||
imbue(const locale& __loc)
|
||||
{
|
||||
bool __testvalid = true;
|
||||
|
||||
const __codecvt_type* _M_codecvt_tmp = 0;
|
||||
if (__builtin_expect(has_facet<__codecvt_type>(__loc), true))
|
||||
_M_codecvt_tmp = &use_facet<__codecvt_type>(__loc);
|
||||
|
||||
if (this->is_open())
|
||||
{
|
||||
// encoding() == -1 is ok only at the beginning.
|
||||
if ((_M_reading || _M_writing)
|
||||
&& __check_facet(_M_codecvt).encoding() == -1)
|
||||
__testvalid = false;
|
||||
else
|
||||
{
|
||||
if (_M_reading)
|
||||
{
|
||||
if (__check_facet(_M_codecvt).always_noconv())
|
||||
{
|
||||
if (_M_codecvt_tmp
|
||||
&& !__check_facet(_M_codecvt_tmp).always_noconv())
|
||||
__testvalid = this->seekoff(0, ios_base::cur, this->_M_mode)
|
||||
!= pos_type(off_type(-1));
|
||||
}
|
||||
else
|
||||
{
|
||||
// External position corresponding to gptr().
|
||||
_M_ext_next = _M_ext_buf
|
||||
+ _M_codecvt->length(_M_state_last, _M_ext_buf, _M_ext_next,
|
||||
this->gptr() - this->eback());
|
||||
const streamsize __remainder = _M_ext_end - _M_ext_next;
|
||||
if (__remainder)
|
||||
std::memmove(_M_ext_buf, _M_ext_next, __remainder);
|
||||
|
||||
_M_ext_next = _M_ext_buf;
|
||||
_M_ext_end = _M_ext_buf + __remainder;
|
||||
_M_set_buffer(-1);
|
||||
_M_state_last = _M_state_cur = _M_state_beg;
|
||||
}
|
||||
}
|
||||
else if (_M_writing && (__testvalid = _M_terminate_output()))
|
||||
_M_set_buffer(-1);
|
||||
}
|
||||
}
|
||||
|
||||
if (__testvalid)
|
||||
_M_codecvt = _M_codecvt_tmp;
|
||||
}
|
||||
|
||||
// Inhibit implicit instantiations for required instantiations,
|
||||
// which are defined via explicit instantiations elsewhere.
|
||||
// NB: This syntax is a GNU extension.
|
||||
#if _GLIBCXX_EXTERN_TEMPLATE
|
||||
extern template class basic_filebuf<char>;
|
||||
extern template class basic_ifstream<char>;
|
||||
extern template class basic_ofstream<char>;
|
||||
extern template class basic_fstream<char>;
|
||||
|
||||
#ifdef _GLIBCXX_USE_WCHAR_T
|
||||
extern template class basic_filebuf<wchar_t>;
|
||||
extern template class basic_ifstream<wchar_t>;
|
||||
extern template class basic_ofstream<wchar_t>;
|
||||
extern template class basic_fstream<wchar_t>;
|
||||
#endif
|
||||
#endif
|
||||
} // namespace std
|
||||
|
||||
#endif
|
||||
@ -0,0 +1,85 @@
|
||||
// Function-Based Exception Support -*- C++ -*-
|
||||
|
||||
// Copyright (C) 2001 Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 2, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING. If not, write to the Free
|
||||
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
// USA.
|
||||
|
||||
// As a special exception, you may use this file as part of a free software
|
||||
// library without restriction. Specifically, if other files instantiate
|
||||
// templates or use macros or inline functions from this file, or you compile
|
||||
// this file and link it with other files to produce an executable, this
|
||||
// file does not by itself cause the resulting executable to be covered by
|
||||
// the GNU General Public License. This exception does not however
|
||||
// invalidate any other reasons why the executable file might be covered by
|
||||
// the GNU General Public License.
|
||||
|
||||
//
|
||||
// ISO C++ 14882: 19.1 Exception classes
|
||||
//
|
||||
|
||||
#include <exception_defines.h>
|
||||
|
||||
namespace std
|
||||
{
|
||||
// Helper for exception objects in <except>
|
||||
void
|
||||
__throw_bad_exception(void);
|
||||
|
||||
// Helper for exception objects in <new>
|
||||
void
|
||||
__throw_bad_alloc(void);
|
||||
|
||||
// Helper for exception objects in <typeinfo>
|
||||
void
|
||||
__throw_bad_cast(void);
|
||||
|
||||
void
|
||||
__throw_bad_typeid(void);
|
||||
|
||||
// Helpers for exception objects in <stdexcept>
|
||||
void
|
||||
__throw_logic_error(const char* __s);
|
||||
|
||||
void
|
||||
__throw_domain_error(const char* __s);
|
||||
|
||||
void
|
||||
__throw_invalid_argument(const char* __s);
|
||||
|
||||
void
|
||||
__throw_length_error(const char* __s);
|
||||
|
||||
void
|
||||
__throw_out_of_range(const char* __s);
|
||||
|
||||
void
|
||||
__throw_runtime_error(const char* __s);
|
||||
|
||||
void
|
||||
__throw_range_error(const char* __s);
|
||||
|
||||
void
|
||||
__throw_overflow_error(const char* __s);
|
||||
|
||||
void
|
||||
__throw_underflow_error(const char* __s);
|
||||
|
||||
// Helpers for exception objects in basic_ios
|
||||
void
|
||||
__throw_ios_failure(const char* __s);
|
||||
} // namespace std
|
||||
|
||||
@ -0,0 +1,165 @@
|
||||
// The template and inlines for the -*- C++ -*- gslice class.
|
||||
|
||||
// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2004
|
||||
// Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 2, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING. If not, write to the Free
|
||||
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
// USA.
|
||||
|
||||
// As a special exception, you may use this file as part of a free software
|
||||
// library without restriction. Specifically, if other files instantiate
|
||||
// templates or use macros or inline functions from this file, or you compile
|
||||
// this file and link it with other files to produce an executable, this
|
||||
// file does not by itself cause the resulting executable to be covered by
|
||||
// the GNU General Public License. This exception does not however
|
||||
// invalidate any other reasons why the executable file might be covered by
|
||||
// the GNU General Public License.
|
||||
|
||||
// Written by Gabriel Dos Reis <Gabriel.Dos-Reis@DPTMaths.ENS-Cachan.Fr>
|
||||
|
||||
/** @file gslice.h
|
||||
* This is an internal header file, included by other library headers.
|
||||
* You should not attempt to use it directly.
|
||||
*/
|
||||
|
||||
#ifndef _GSLICE_H
|
||||
#define _GSLICE_H 1
|
||||
|
||||
#pragma GCC system_header
|
||||
|
||||
namespace std {
|
||||
|
||||
/**
|
||||
* @brief Class defining multi-dimensional subset of an array.
|
||||
*
|
||||
* The slice class represents a multi-dimensional subset of an array,
|
||||
* specified by three parameter sets: start offset, size array, and stride
|
||||
* array. The start offset is the index of the first element of the array
|
||||
* that is part of the subset. The size and stride array describe each
|
||||
* dimension of the slice. Size is the number of elements in that
|
||||
* dimension, and stride is the distance in the array between successive
|
||||
* elements in that dimension. Each dimension's size and stride is taken
|
||||
* to begin at an array element described by the previous dimension. The
|
||||
* size array and stride array must be the same size.
|
||||
*
|
||||
* For example, if you have offset==3, stride[0]==11, size[1]==3,
|
||||
* stride[1]==3, then slice[0,0]==array[3], slice[0,1]==array[6],
|
||||
* slice[0,2]==array[9], slice[1,0]==array[14], slice[1,1]==array[17],
|
||||
* slice[1,2]==array[20].
|
||||
*/
|
||||
class gslice
|
||||
{
|
||||
public:
|
||||
/// Construct an empty slice.
|
||||
gslice ();
|
||||
|
||||
/**
|
||||
* @brief Construct a slice.
|
||||
*
|
||||
* Constructs a slice with as many dimensions as the length of the @a l
|
||||
* and @a s arrays.
|
||||
*
|
||||
* @param o Offset in array of first element.
|
||||
* @param l Array of dimension lengths.
|
||||
* @param s Array of dimension strides between array elements.
|
||||
*/
|
||||
gslice(size_t, const valarray<size_t>&, const valarray<size_t>&);
|
||||
|
||||
// XXX: the IS says the copy-ctor and copy-assignment operators are
|
||||
// synthetized by the compiler but they are just unsuitable
|
||||
// for a ref-counted semantic
|
||||
/// Copy constructor.
|
||||
gslice(const gslice&);
|
||||
|
||||
/// Destructor.
|
||||
~gslice();
|
||||
|
||||
// XXX: See the note above.
|
||||
/// Assignment operator.
|
||||
gslice& operator=(const gslice&);
|
||||
|
||||
/// Return array offset of first slice element.
|
||||
size_t start() const;
|
||||
|
||||
/// Return array of sizes of slice dimensions.
|
||||
valarray<size_t> size() const;
|
||||
|
||||
/// Return array of array strides for each dimension.
|
||||
valarray<size_t> stride() const;
|
||||
|
||||
private:
|
||||
struct _Indexer {
|
||||
size_t _M_count;
|
||||
size_t _M_start;
|
||||
valarray<size_t> _M_size;
|
||||
valarray<size_t> _M_stride;
|
||||
valarray<size_t> _M_index; // Linear array of referenced indices
|
||||
_Indexer(size_t, const valarray<size_t>&,
|
||||
const valarray<size_t>&);
|
||||
void _M_increment_use() { ++_M_count; }
|
||||
size_t _M_decrement_use() { return --_M_count; }
|
||||
};
|
||||
|
||||
_Indexer* _M_index;
|
||||
|
||||
template<typename _Tp> friend class valarray;
|
||||
};
|
||||
|
||||
inline size_t
|
||||
gslice::start () const
|
||||
{ return _M_index ? _M_index->_M_start : 0; }
|
||||
|
||||
inline valarray<size_t>
|
||||
gslice::size () const
|
||||
{ return _M_index ? _M_index->_M_size : valarray<size_t>(); }
|
||||
|
||||
inline valarray<size_t>
|
||||
gslice::stride () const
|
||||
{ return _M_index ? _M_index->_M_stride : valarray<size_t>(); }
|
||||
|
||||
inline gslice::gslice () : _M_index(0) {}
|
||||
|
||||
inline
|
||||
gslice::gslice(size_t __o, const valarray<size_t>& __l,
|
||||
const valarray<size_t>& __s)
|
||||
: _M_index(new gslice::_Indexer(__o, __l, __s)) {}
|
||||
|
||||
inline
|
||||
gslice::gslice(const gslice& __g) : _M_index(__g._M_index)
|
||||
{ if (_M_index) _M_index->_M_increment_use(); }
|
||||
|
||||
inline
|
||||
gslice::~gslice()
|
||||
{ if (_M_index && _M_index->_M_decrement_use() == 0) delete _M_index; }
|
||||
|
||||
inline gslice&
|
||||
gslice::operator= (const gslice& __g)
|
||||
{
|
||||
if (__g._M_index) __g._M_index->_M_increment_use();
|
||||
if (_M_index && _M_index->_M_decrement_use() == 0) delete _M_index;
|
||||
_M_index = __g._M_index;
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
||||
} // std::
|
||||
|
||||
|
||||
#endif /* _GSLICE_H */
|
||||
|
||||
// Local Variables:
|
||||
// mode:c++
|
||||
// End:
|
||||
@ -0,0 +1,220 @@
|
||||
// The template and inlines for the -*- C++ -*- gslice_array class.
|
||||
|
||||
// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2004
|
||||
// Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 2, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING. If not, write to the Free
|
||||
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
// USA.
|
||||
|
||||
// As a special exception, you may use this file as part of a free software
|
||||
// library without restriction. Specifically, if other files instantiate
|
||||
// templates or use macros or inline functions from this file, or you compile
|
||||
// this file and link it with other files to produce an executable, this
|
||||
// file does not by itself cause the resulting executable to be covered by
|
||||
// the GNU General Public License. This exception does not however
|
||||
// invalidate any other reasons why the executable file might be covered by
|
||||
// the GNU General Public License.
|
||||
|
||||
// Written by Gabriel Dos Reis <Gabriel.Dos-Reis@DPTMaths.ENS-Cachan.Fr>
|
||||
|
||||
/** @file gslice_array.h
|
||||
* This is an internal header file, included by other library headers.
|
||||
* You should not attempt to use it directly.
|
||||
*/
|
||||
|
||||
#ifndef _GSLICE_ARRAY_H
|
||||
#define _GSLICE_ARRAY_H 1
|
||||
|
||||
#pragma GCC system_header
|
||||
|
||||
namespace std {
|
||||
|
||||
/**
|
||||
* @brief Reference to multi-dimensional subset of an array.
|
||||
*
|
||||
* A gslice_array is a reference to the actual elements of an array
|
||||
* specified by a gslice. The way to get a gslice_array is to call
|
||||
* operator[](gslice) on a valarray. The returned gslice_array then
|
||||
* permits carrying operations out on the referenced subset of elements in
|
||||
* the original valarray. For example, operator+=(valarray) will add
|
||||
* values to the subset of elements in the underlying valarray this
|
||||
* gslice_array refers to.
|
||||
*
|
||||
* @param Tp Element type.
|
||||
*/
|
||||
template<typename _Tp>
|
||||
class gslice_array
|
||||
{
|
||||
public:
|
||||
typedef _Tp value_type;
|
||||
|
||||
// _GLIBCXX_RESOLVE_LIB_DEFECTS
|
||||
// 253. valarray helper functions are almost entirely useless
|
||||
|
||||
/// Copy constructor. Both slices refer to the same underlying array.
|
||||
gslice_array(const gslice_array&);
|
||||
|
||||
/// Assignment operator. Assigns slice elements to corresponding
|
||||
/// elements of @a a.
|
||||
gslice_array& operator=(const gslice_array&);
|
||||
|
||||
/// Assign slice elements to corresponding elements of @a v.
|
||||
void operator=(const valarray<_Tp>&) const;
|
||||
/// Multiply slice elements by corresponding elements of @a v.
|
||||
void operator*=(const valarray<_Tp>&) const;
|
||||
/// Divide slice elements by corresponding elements of @a v.
|
||||
void operator/=(const valarray<_Tp>&) const;
|
||||
/// Modulo slice elements by corresponding elements of @a v.
|
||||
void operator%=(const valarray<_Tp>&) const;
|
||||
/// Add corresponding elements of @a v to slice elements.
|
||||
void operator+=(const valarray<_Tp>&) const;
|
||||
/// Subtract corresponding elements of @a v from slice elements.
|
||||
void operator-=(const valarray<_Tp>&) const;
|
||||
/// Logical xor slice elements with corresponding elements of @a v.
|
||||
void operator^=(const valarray<_Tp>&) const;
|
||||
/// Logical and slice elements with corresponding elements of @a v.
|
||||
void operator&=(const valarray<_Tp>&) const;
|
||||
/// Logical or slice elements with corresponding elements of @a v.
|
||||
void operator|=(const valarray<_Tp>&) const;
|
||||
/// Left shift slice elements by corresponding elements of @a v.
|
||||
void operator<<=(const valarray<_Tp>&) const;
|
||||
/// Right shift slice elements by corresponding elements of @a v.
|
||||
void operator>>=(const valarray<_Tp>&) const;
|
||||
/// Assign all slice elements to @a t.
|
||||
void operator=(const _Tp&) const;
|
||||
|
||||
template<class _Dom>
|
||||
void operator=(const _Expr<_Dom,_Tp>&) const;
|
||||
template<class _Dom>
|
||||
void operator*=(const _Expr<_Dom,_Tp>&) const;
|
||||
template<class _Dom>
|
||||
void operator/=(const _Expr<_Dom,_Tp>&) const;
|
||||
template<class _Dom>
|
||||
void operator%=(const _Expr<_Dom,_Tp>&) const;
|
||||
template<class _Dom>
|
||||
void operator+=(const _Expr<_Dom,_Tp>&) const;
|
||||
template<class _Dom>
|
||||
void operator-=(const _Expr<_Dom,_Tp>&) const;
|
||||
template<class _Dom>
|
||||
void operator^=(const _Expr<_Dom,_Tp>&) const;
|
||||
template<class _Dom>
|
||||
void operator&=(const _Expr<_Dom,_Tp>&) const;
|
||||
template<class _Dom>
|
||||
void operator|=(const _Expr<_Dom,_Tp>&) const;
|
||||
template<class _Dom>
|
||||
void operator<<=(const _Expr<_Dom,_Tp>&) const;
|
||||
template<class _Dom>
|
||||
void operator>>=(const _Expr<_Dom,_Tp>&) const;
|
||||
|
||||
private:
|
||||
_Array<_Tp> _M_array;
|
||||
const valarray<size_t>& _M_index;
|
||||
|
||||
friend class valarray<_Tp>;
|
||||
|
||||
gslice_array(_Array<_Tp>, const valarray<size_t>&);
|
||||
|
||||
// not implemented
|
||||
gslice_array();
|
||||
};
|
||||
|
||||
template<typename _Tp>
|
||||
inline
|
||||
gslice_array<_Tp>::gslice_array(_Array<_Tp> __a,
|
||||
const valarray<size_t>& __i)
|
||||
: _M_array(__a), _M_index(__i) {}
|
||||
|
||||
|
||||
template<typename _Tp>
|
||||
inline
|
||||
gslice_array<_Tp>::gslice_array(const gslice_array<_Tp>& __a)
|
||||
: _M_array(__a._M_array), _M_index(__a._M_index) {}
|
||||
|
||||
|
||||
template<typename _Tp>
|
||||
inline gslice_array<_Tp>&
|
||||
gslice_array<_Tp>::operator=(const gslice_array<_Tp>& __a)
|
||||
{
|
||||
std::__valarray_copy(_Array<_Tp>(__a._M_array),
|
||||
_Array<size_t>(__a._M_index), _M_index.size(),
|
||||
_M_array, _Array<size_t>(_M_index));
|
||||
return *this;
|
||||
}
|
||||
|
||||
template<typename _Tp>
|
||||
inline void
|
||||
gslice_array<_Tp>::operator=(const _Tp& __t) const
|
||||
{
|
||||
std::__valarray_fill(_M_array, _Array<size_t>(_M_index),
|
||||
_M_index.size(), __t);
|
||||
}
|
||||
|
||||
template<typename _Tp>
|
||||
inline void
|
||||
gslice_array<_Tp>::operator=(const valarray<_Tp>& __v) const
|
||||
{
|
||||
std::__valarray_copy(_Array<_Tp>(__v), __v.size(),
|
||||
_M_array, _Array<size_t>(_M_index));
|
||||
}
|
||||
|
||||
template<typename _Tp>
|
||||
template<class _Dom>
|
||||
inline void
|
||||
gslice_array<_Tp>::operator=(const _Expr<_Dom, _Tp>& __e) const
|
||||
{
|
||||
std::__valarray_copy (__e, _M_index.size(), _M_array,
|
||||
_Array<size_t>(_M_index));
|
||||
}
|
||||
|
||||
#undef _DEFINE_VALARRAY_OPERATOR
|
||||
#define _DEFINE_VALARRAY_OPERATOR(_Op, _Name) \
|
||||
template<typename _Tp> \
|
||||
inline void \
|
||||
gslice_array<_Tp>::operator _Op##=(const valarray<_Tp>& __v) const \
|
||||
{ \
|
||||
_Array_augmented_##_Name(_M_array, _Array<size_t>(_M_index), \
|
||||
_Array<_Tp>(__v), __v.size()); \
|
||||
} \
|
||||
\
|
||||
template<typename _Tp> \
|
||||
template<class _Dom> \
|
||||
inline void \
|
||||
gslice_array<_Tp>::operator _Op##= (const _Expr<_Dom, _Tp>& __e) const\
|
||||
{ \
|
||||
_Array_augmented_##_Name(_M_array, _Array<size_t>(_M_index), __e,\
|
||||
_M_index.size()); \
|
||||
}
|
||||
|
||||
_DEFINE_VALARRAY_OPERATOR(*, __multiplies)
|
||||
_DEFINE_VALARRAY_OPERATOR(/, __divides)
|
||||
_DEFINE_VALARRAY_OPERATOR(%, __modulus)
|
||||
_DEFINE_VALARRAY_OPERATOR(+, __plus)
|
||||
_DEFINE_VALARRAY_OPERATOR(-, __minus)
|
||||
_DEFINE_VALARRAY_OPERATOR(^, __bitwise_xor)
|
||||
_DEFINE_VALARRAY_OPERATOR(&, __bitwise_and)
|
||||
_DEFINE_VALARRAY_OPERATOR(|, __bitwise_or)
|
||||
_DEFINE_VALARRAY_OPERATOR(<<, __shift_left)
|
||||
_DEFINE_VALARRAY_OPERATOR(>>, __shift_right)
|
||||
|
||||
#undef _DEFINE_VALARRAY_OPERATOR
|
||||
|
||||
} // std::
|
||||
|
||||
#endif /* _GSLICE_ARRAY_H */
|
||||
|
||||
// Local Variables:
|
||||
// mode:c++
|
||||
// End:
|
||||
@ -0,0 +1,212 @@
|
||||
// The template and inlines for the -*- C++ -*- indirect_array class.
|
||||
|
||||
// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2004
|
||||
// Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 2, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING. If not, write to the Free
|
||||
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
// USA.
|
||||
|
||||
// As a special exception, you may use this file as part of a free software
|
||||
// library without restriction. Specifically, if other files instantiate
|
||||
// templates or use macros or inline functions from this file, or you compile
|
||||
// this file and link it with other files to produce an executable, this
|
||||
// file does not by itself cause the resulting executable to be covered by
|
||||
// the GNU General Public License. This exception does not however
|
||||
// invalidate any other reasons why the executable file might be covered by
|
||||
// the GNU General Public License.
|
||||
|
||||
// Written by Gabriel Dos Reis <Gabriel.Dos-Reis@DPTMaths.ENS-Cachan.Fr>
|
||||
|
||||
/** @file indirect_array.h
|
||||
* This is an internal header file, included by other library headers.
|
||||
* You should not attempt to use it directly.
|
||||
*/
|
||||
|
||||
#ifndef _INDIRECT_ARRAY_H
|
||||
#define _INDIRECT_ARRAY_H 1
|
||||
|
||||
#pragma GCC system_header
|
||||
|
||||
namespace std
|
||||
{
|
||||
/**
|
||||
* @brief Reference to arbitrary subset of an array.
|
||||
*
|
||||
* An indirect_array is a reference to the actual elements of an array
|
||||
* specified by an ordered array of indices. The way to get an indirect_array is to
|
||||
* call operator[](valarray<size_t>) on a valarray. The returned
|
||||
* indirect_array then permits carrying operations out on the referenced
|
||||
* subset of elements in the original valarray.
|
||||
*
|
||||
* For example, if an indirect_array is obtained using the array (4,2,0) as
|
||||
* an argument, and then assigned to an array containing (1,2,3), then the
|
||||
* underlying array will have array[0]==3, array[2]==2, and array[4]==1.
|
||||
*
|
||||
* @param Tp Element type.
|
||||
*/
|
||||
template <class _Tp>
|
||||
class indirect_array
|
||||
{
|
||||
public:
|
||||
typedef _Tp value_type;
|
||||
|
||||
// _GLIBCXX_RESOLVE_LIB_DEFECTS
|
||||
// 253. valarray helper functions are almost entirely useless
|
||||
|
||||
/// Copy constructor. Both slices refer to the same underlying array.
|
||||
indirect_array(const indirect_array&);
|
||||
|
||||
/// Assignment operator. Assigns elements to corresponding elements
|
||||
/// of @a a.
|
||||
indirect_array& operator=(const indirect_array&);
|
||||
|
||||
/// Assign slice elements to corresponding elements of @a v.
|
||||
void operator=(const valarray<_Tp>&) const;
|
||||
/// Multiply slice elements by corresponding elements of @a v.
|
||||
void operator*=(const valarray<_Tp>&) const;
|
||||
/// Divide slice elements by corresponding elements of @a v.
|
||||
void operator/=(const valarray<_Tp>&) const;
|
||||
/// Modulo slice elements by corresponding elements of @a v.
|
||||
void operator%=(const valarray<_Tp>&) const;
|
||||
/// Add corresponding elements of @a v to slice elements.
|
||||
void operator+=(const valarray<_Tp>&) const;
|
||||
/// Subtract corresponding elements of @a v from slice elements.
|
||||
void operator-=(const valarray<_Tp>&) const;
|
||||
/// Logical xor slice elements with corresponding elements of @a v.
|
||||
void operator^=(const valarray<_Tp>&) const;
|
||||
/// Logical and slice elements with corresponding elements of @a v.
|
||||
void operator&=(const valarray<_Tp>&) const;
|
||||
/// Logical or slice elements with corresponding elements of @a v.
|
||||
void operator|=(const valarray<_Tp>&) const;
|
||||
/// Left shift slice elements by corresponding elements of @a v.
|
||||
void operator<<=(const valarray<_Tp>&) const;
|
||||
/// Right shift slice elements by corresponding elements of @a v.
|
||||
void operator>>=(const valarray<_Tp>&) const;
|
||||
/// Assign all slice elements to @a t.
|
||||
void operator= (const _Tp&) const;
|
||||
// ~indirect_array();
|
||||
|
||||
template<class _Dom>
|
||||
void operator=(const _Expr<_Dom, _Tp>&) const;
|
||||
template<class _Dom>
|
||||
void operator*=(const _Expr<_Dom, _Tp>&) const;
|
||||
template<class _Dom>
|
||||
void operator/=(const _Expr<_Dom, _Tp>&) const;
|
||||
template<class _Dom>
|
||||
void operator%=(const _Expr<_Dom, _Tp>&) const;
|
||||
template<class _Dom>
|
||||
void operator+=(const _Expr<_Dom, _Tp>&) const;
|
||||
template<class _Dom>
|
||||
void operator-=(const _Expr<_Dom, _Tp>&) const;
|
||||
template<class _Dom>
|
||||
void operator^=(const _Expr<_Dom, _Tp>&) const;
|
||||
template<class _Dom>
|
||||
void operator&=(const _Expr<_Dom, _Tp>&) const;
|
||||
template<class _Dom>
|
||||
void operator|=(const _Expr<_Dom, _Tp>&) const;
|
||||
template<class _Dom>
|
||||
void operator<<=(const _Expr<_Dom, _Tp>&) const;
|
||||
template<class _Dom>
|
||||
void operator>>=(const _Expr<_Dom, _Tp>&) const;
|
||||
|
||||
private:
|
||||
/// Copy constructor. Both slices refer to the same underlying array.
|
||||
indirect_array(_Array<_Tp>, size_t, _Array<size_t>);
|
||||
|
||||
friend class valarray<_Tp>;
|
||||
friend class gslice_array<_Tp>;
|
||||
|
||||
const size_t _M_sz;
|
||||
const _Array<size_t> _M_index;
|
||||
const _Array<_Tp> _M_array;
|
||||
|
||||
// not implemented
|
||||
indirect_array();
|
||||
};
|
||||
|
||||
template<typename _Tp>
|
||||
inline
|
||||
indirect_array<_Tp>::indirect_array(const indirect_array<_Tp>& __a)
|
||||
: _M_sz(__a._M_sz), _M_index(__a._M_index), _M_array(__a._M_array) {}
|
||||
|
||||
template<typename _Tp>
|
||||
inline
|
||||
indirect_array<_Tp>::indirect_array(_Array<_Tp> __a, size_t __s,
|
||||
_Array<size_t> __i)
|
||||
: _M_sz(__s), _M_index(__i), _M_array(__a) {}
|
||||
|
||||
template<typename _Tp>
|
||||
inline indirect_array<_Tp>&
|
||||
indirect_array<_Tp>::operator=(const indirect_array<_Tp>& __a)
|
||||
{
|
||||
std::__valarray_copy(__a._M_array, _M_sz, __a._M_index, _M_array, _M_index);
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
||||
template<typename _Tp>
|
||||
inline void
|
||||
indirect_array<_Tp>::operator=(const _Tp& __t) const
|
||||
{ std::__valarray_fill(_M_array, _M_index, _M_sz, __t); }
|
||||
|
||||
template<typename _Tp>
|
||||
inline void
|
||||
indirect_array<_Tp>::operator=(const valarray<_Tp>& __v) const
|
||||
{ std::__valarray_copy(_Array<_Tp>(__v), _M_sz, _M_array, _M_index); }
|
||||
|
||||
template<typename _Tp>
|
||||
template<class _Dom>
|
||||
inline void
|
||||
indirect_array<_Tp>::operator=(const _Expr<_Dom,_Tp>& __e) const
|
||||
{ std::__valarray_copy(__e, _M_sz, _M_array, _M_index); }
|
||||
|
||||
#undef _DEFINE_VALARRAY_OPERATOR
|
||||
#define _DEFINE_VALARRAY_OPERATOR(_Op, _Name) \
|
||||
template<typename _Tp> \
|
||||
inline void \
|
||||
indirect_array<_Tp>::operator _Op##=(const valarray<_Tp>& __v) const\
|
||||
{ \
|
||||
_Array_augmented_##_Name(_M_array, _M_index, _Array<_Tp>(__v), _M_sz); \
|
||||
} \
|
||||
\
|
||||
template<typename _Tp> \
|
||||
template<class _Dom> \
|
||||
inline void \
|
||||
indirect_array<_Tp>::operator _Op##=(const _Expr<_Dom,_Tp>& __e) const\
|
||||
{ \
|
||||
_Array_augmented_##_Name(_M_array, _M_index, __e, _M_sz); \
|
||||
}
|
||||
|
||||
_DEFINE_VALARRAY_OPERATOR(*, __multiplies)
|
||||
_DEFINE_VALARRAY_OPERATOR(/, __divides)
|
||||
_DEFINE_VALARRAY_OPERATOR(%, __modulus)
|
||||
_DEFINE_VALARRAY_OPERATOR(+, __plus)
|
||||
_DEFINE_VALARRAY_OPERATOR(-, __minus)
|
||||
_DEFINE_VALARRAY_OPERATOR(^, __bitwise_xor)
|
||||
_DEFINE_VALARRAY_OPERATOR(&, __bitwise_and)
|
||||
_DEFINE_VALARRAY_OPERATOR(|, __bitwise_or)
|
||||
_DEFINE_VALARRAY_OPERATOR(<<, __shift_left)
|
||||
_DEFINE_VALARRAY_OPERATOR(>>, __shift_right)
|
||||
|
||||
#undef _DEFINE_VALARRAY_OPERATOR
|
||||
|
||||
} // std::
|
||||
|
||||
#endif /* _INDIRECT_ARRAY_H */
|
||||
|
||||
// Local Variables:
|
||||
// mode:c++
|
||||
// End:
|
||||
@ -0,0 +1,926 @@
|
||||
// Iostreams base classes -*- C++ -*-
|
||||
|
||||
// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
|
||||
// Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 2, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING. If not, write to the Free
|
||||
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
// USA.
|
||||
|
||||
// As a special exception, you may use this file as part of a free software
|
||||
// library without restriction. Specifically, if other files instantiate
|
||||
// templates or use macros or inline functions from this file, or you compile
|
||||
// this file and link it with other files to produce an executable, this
|
||||
// file does not by itself cause the resulting executable to be covered by
|
||||
// the GNU General Public License. This exception does not however
|
||||
// invalidate any other reasons why the executable file might be covered by
|
||||
// the GNU General Public License.
|
||||
|
||||
//
|
||||
// ISO C++ 14882: 27.4 Iostreams base classes
|
||||
//
|
||||
|
||||
/** @file ios_base.h
|
||||
* This is an internal header file, included by other library headers.
|
||||
* You should not attempt to use it directly.
|
||||
*/
|
||||
|
||||
#ifndef _IOS_BASE_H
|
||||
#define _IOS_BASE_H 1
|
||||
|
||||
#pragma GCC system_header
|
||||
|
||||
#include <bits/atomicity.h>
|
||||
#include <bits/localefwd.h>
|
||||
#include <bits/locale_classes.h>
|
||||
|
||||
namespace std
|
||||
{
|
||||
// The following definitions of bitmask types are enums, not ints,
|
||||
// as permitted (but not required) in the standard, in order to provide
|
||||
// better type safety in iostream calls. A side effect is that
|
||||
// expressions involving them are no longer compile-time constants.
|
||||
enum _Ios_Fmtflags { _S_ios_fmtflags_end = 1L << 16 };
|
||||
|
||||
inline _Ios_Fmtflags
|
||||
operator&(_Ios_Fmtflags __a, _Ios_Fmtflags __b)
|
||||
{ return _Ios_Fmtflags(static_cast<int>(__a) & static_cast<int>(__b)); }
|
||||
|
||||
inline _Ios_Fmtflags
|
||||
operator|(_Ios_Fmtflags __a, _Ios_Fmtflags __b)
|
||||
{ return _Ios_Fmtflags(static_cast<int>(__a) | static_cast<int>(__b)); }
|
||||
|
||||
inline _Ios_Fmtflags
|
||||
operator^(_Ios_Fmtflags __a, _Ios_Fmtflags __b)
|
||||
{ return _Ios_Fmtflags(static_cast<int>(__a) ^ static_cast<int>(__b)); }
|
||||
|
||||
inline _Ios_Fmtflags
|
||||
operator|=(_Ios_Fmtflags& __a, _Ios_Fmtflags __b)
|
||||
{ return __a = __a | __b; }
|
||||
|
||||
inline _Ios_Fmtflags
|
||||
operator&=(_Ios_Fmtflags& __a, _Ios_Fmtflags __b)
|
||||
{ return __a = __a & __b; }
|
||||
|
||||
inline _Ios_Fmtflags
|
||||
operator^=(_Ios_Fmtflags& __a, _Ios_Fmtflags __b)
|
||||
{ return __a = __a ^ __b; }
|
||||
|
||||
inline _Ios_Fmtflags
|
||||
operator~(_Ios_Fmtflags __a)
|
||||
{ return _Ios_Fmtflags(~static_cast<int>(__a)); }
|
||||
|
||||
|
||||
enum _Ios_Openmode { _S_ios_openmode_end = 1L << 16 };
|
||||
|
||||
inline _Ios_Openmode
|
||||
operator&(_Ios_Openmode __a, _Ios_Openmode __b)
|
||||
{ return _Ios_Openmode(static_cast<int>(__a) & static_cast<int>(__b)); }
|
||||
|
||||
inline _Ios_Openmode
|
||||
operator|(_Ios_Openmode __a, _Ios_Openmode __b)
|
||||
{ return _Ios_Openmode(static_cast<int>(__a) | static_cast<int>(__b)); }
|
||||
|
||||
inline _Ios_Openmode
|
||||
operator^(_Ios_Openmode __a, _Ios_Openmode __b)
|
||||
{ return _Ios_Openmode(static_cast<int>(__a) ^ static_cast<int>(__b)); }
|
||||
|
||||
inline _Ios_Openmode
|
||||
operator|=(_Ios_Openmode& __a, _Ios_Openmode __b)
|
||||
{ return __a = __a | __b; }
|
||||
|
||||
inline _Ios_Openmode
|
||||
operator&=(_Ios_Openmode& __a, _Ios_Openmode __b)
|
||||
{ return __a = __a & __b; }
|
||||
|
||||
inline _Ios_Openmode
|
||||
operator^=(_Ios_Openmode& __a, _Ios_Openmode __b)
|
||||
{ return __a = __a ^ __b; }
|
||||
|
||||
inline _Ios_Openmode
|
||||
operator~(_Ios_Openmode __a)
|
||||
{ return _Ios_Openmode(~static_cast<int>(__a)); }
|
||||
|
||||
|
||||
enum _Ios_Iostate { _S_ios_iostate_end = 1L << 16 };
|
||||
|
||||
inline _Ios_Iostate
|
||||
operator&(_Ios_Iostate __a, _Ios_Iostate __b)
|
||||
{ return _Ios_Iostate(static_cast<int>(__a) & static_cast<int>(__b)); }
|
||||
|
||||
inline _Ios_Iostate
|
||||
operator|(_Ios_Iostate __a, _Ios_Iostate __b)
|
||||
{ return _Ios_Iostate(static_cast<int>(__a) | static_cast<int>(__b)); }
|
||||
|
||||
inline _Ios_Iostate
|
||||
operator^(_Ios_Iostate __a, _Ios_Iostate __b)
|
||||
{ return _Ios_Iostate(static_cast<int>(__a) ^ static_cast<int>(__b)); }
|
||||
|
||||
inline _Ios_Iostate
|
||||
operator|=(_Ios_Iostate& __a, _Ios_Iostate __b)
|
||||
{ return __a = __a | __b; }
|
||||
|
||||
inline _Ios_Iostate
|
||||
operator&=(_Ios_Iostate& __a, _Ios_Iostate __b)
|
||||
{ return __a = __a & __b; }
|
||||
|
||||
inline _Ios_Iostate
|
||||
operator^=(_Ios_Iostate& __a, _Ios_Iostate __b)
|
||||
{ return __a = __a ^ __b; }
|
||||
|
||||
inline _Ios_Iostate
|
||||
operator~(_Ios_Iostate __a)
|
||||
{ return _Ios_Iostate(~static_cast<int>(__a)); }
|
||||
|
||||
enum _Ios_Seekdir { _S_ios_seekdir_end = 1L << 16 };
|
||||
|
||||
// 27.4.2 Class ios_base
|
||||
/**
|
||||
* @brief The very top of the I/O class hierarchy.
|
||||
*
|
||||
* This class defines everything that can be defined about I/O that does
|
||||
* not depend on the type of characters being input or output. Most
|
||||
* people will only see @c ios_base when they need to specify the full
|
||||
* name of the various I/O flags (e.g., the openmodes).
|
||||
*/
|
||||
class ios_base
|
||||
{
|
||||
public:
|
||||
|
||||
// 27.4.2.1.1 Class ios_base::failure
|
||||
/// These are thrown to indicate problems. Doc me.
|
||||
class failure : public exception
|
||||
{
|
||||
public:
|
||||
// _GLIBCXX_RESOLVE_LIB_DEFECTS
|
||||
// 48. Use of non-existent exception constructor
|
||||
explicit
|
||||
failure(const string& __str) throw();
|
||||
|
||||
// This declaration is not useless:
|
||||
// http://gcc.gnu.org/onlinedocs/gcc-3.0.2/gcc_6.html#SEC118
|
||||
virtual
|
||||
~failure() throw();
|
||||
|
||||
virtual const char*
|
||||
what() const throw();
|
||||
|
||||
private:
|
||||
string _M_msg;
|
||||
};
|
||||
|
||||
// 27.4.2.1.2 Type ios_base::fmtflags
|
||||
/**
|
||||
* @brief This is a bitmask type.
|
||||
*
|
||||
* @c "_Ios_Fmtflags" is implementation-defined, but it is valid to
|
||||
* perform bitwise operations on these values and expect the Right
|
||||
* Thing to happen. Defined objects of type fmtflags are:
|
||||
* - boolalpha
|
||||
* - dec
|
||||
* - fixed
|
||||
* - hex
|
||||
* - internal
|
||||
* - left
|
||||
* - oct
|
||||
* - right
|
||||
* - scientific
|
||||
* - showbase
|
||||
* - showpoint
|
||||
* - showpos
|
||||
* - skipws
|
||||
* - unitbuf
|
||||
* - uppercase
|
||||
* - adjustfield
|
||||
* - basefield
|
||||
* - floatfield
|
||||
*/
|
||||
typedef _Ios_Fmtflags fmtflags;
|
||||
|
||||
/// Insert/extract @c bool in alphabetic rather than numeric format.
|
||||
static const fmtflags boolalpha = fmtflags(__ios_flags::_S_boolalpha);
|
||||
|
||||
/// Converts integer input or generates integer output in decimal base.
|
||||
static const fmtflags dec = fmtflags(__ios_flags::_S_dec);
|
||||
|
||||
/// Generate floating-point output in fixed-point notation.
|
||||
static const fmtflags fixed = fmtflags(__ios_flags::_S_fixed);
|
||||
|
||||
/// Converts integer input or generates integer output in hexadecimal base.
|
||||
static const fmtflags hex = fmtflags(__ios_flags::_S_hex);
|
||||
|
||||
/// Adds fill characters at a designated internal point in certain
|
||||
/// generated output, or identical to @c right if no such point is
|
||||
/// designated.
|
||||
static const fmtflags internal = fmtflags(__ios_flags::_S_internal);
|
||||
|
||||
/// Adds fill characters on the right (final positions) of certain
|
||||
/// generated output. (I.e., the thing you print is flush left.)
|
||||
static const fmtflags left = fmtflags(__ios_flags::_S_left);
|
||||
|
||||
/// Converts integer input or generates integer output in octal base.
|
||||
static const fmtflags oct = fmtflags(__ios_flags::_S_oct);
|
||||
|
||||
/// Adds fill characters on the left (initial positions) of certain
|
||||
/// generated output. (I.e., the thing you print is flush right.)
|
||||
static const fmtflags right = fmtflags(__ios_flags::_S_right);
|
||||
|
||||
/// Generates floating-point output in scientific notation.
|
||||
static const fmtflags scientific = fmtflags(__ios_flags::_S_scientific);
|
||||
|
||||
/// Generates a prefix indicating the numeric base of generated integer
|
||||
/// output.
|
||||
static const fmtflags showbase = fmtflags(__ios_flags::_S_showbase);
|
||||
|
||||
/// Generates a decimal-point character unconditionally in generated
|
||||
/// floating-point output.
|
||||
static const fmtflags showpoint = fmtflags(__ios_flags::_S_showpoint);
|
||||
|
||||
/// Generates a + sign in non-negative generated numeric output.
|
||||
static const fmtflags showpos = fmtflags(__ios_flags::_S_showpos);
|
||||
|
||||
/// Skips leading white space before certain input operations.
|
||||
static const fmtflags skipws = fmtflags(__ios_flags::_S_skipws);
|
||||
|
||||
/// Flushes output after each output operation.
|
||||
static const fmtflags unitbuf = fmtflags(__ios_flags::_S_unitbuf);
|
||||
|
||||
/// Replaces certain lowercase letters with their uppercase equivalents
|
||||
/// in generated output.
|
||||
static const fmtflags uppercase = fmtflags(__ios_flags::_S_uppercase);
|
||||
|
||||
/// A mask of left|right|internal. Useful for the 2-arg form of @c setf.
|
||||
static const fmtflags adjustfield = fmtflags(__ios_flags::_S_adjustfield);
|
||||
|
||||
/// A mask of dec|oct|hex. Useful for the 2-arg form of @c setf.
|
||||
static const fmtflags basefield = fmtflags(__ios_flags::_S_basefield);
|
||||
|
||||
/// A mask of scientific|fixed. Useful for the 2-arg form of @c setf.
|
||||
static const fmtflags floatfield = fmtflags(__ios_flags::_S_floatfield);
|
||||
|
||||
// 27.4.2.1.3 Type ios_base::iostate
|
||||
/**
|
||||
* @brief This is a bitmask type.
|
||||
*
|
||||
* @c "_Ios_Iostate" is implementation-defined, but it is valid to
|
||||
* perform bitwise operations on these values and expect the Right
|
||||
* Thing to happen. Defined objects of type iostate are:
|
||||
* - badbit
|
||||
* - eofbit
|
||||
* - failbit
|
||||
* - goodbit
|
||||
*/
|
||||
typedef _Ios_Iostate iostate;
|
||||
|
||||
/// Indicates a loss of integrity in an input or output sequence (such
|
||||
/// as an irrecoverable read error from a file).
|
||||
static const iostate badbit = iostate(__ios_flags::_S_badbit);
|
||||
|
||||
/// Indicates that an input operation reached the end of an input sequence.
|
||||
static const iostate eofbit = iostate(__ios_flags::_S_eofbit);
|
||||
|
||||
/// Indicates that an input operation failed to read the expected
|
||||
/// characters, or that an output operation failed to generate the
|
||||
/// desired characters.
|
||||
static const iostate failbit = iostate(__ios_flags::_S_failbit);
|
||||
|
||||
/// Indicates all is well.
|
||||
static const iostate goodbit = iostate(0);
|
||||
|
||||
// 27.4.2.1.4 Type ios_base::openmode
|
||||
/**
|
||||
* @brief This is a bitmask type.
|
||||
*
|
||||
* @c "_Ios_Openmode" is implementation-defined, but it is valid to
|
||||
* perform bitwise operations on these values and expect the Right
|
||||
* Thing to happen. Defined objects of type openmode are:
|
||||
* - app
|
||||
* - ate
|
||||
* - binary
|
||||
* - in
|
||||
* - out
|
||||
* - trunc
|
||||
*/
|
||||
typedef _Ios_Openmode openmode;
|
||||
|
||||
/// Seek to end before each write.
|
||||
static const openmode app = openmode(__ios_flags::_S_app);
|
||||
|
||||
/// Open and seek to end immediately after opening.
|
||||
static const openmode ate = openmode(__ios_flags::_S_ate);
|
||||
|
||||
/// Perform input and output in binary mode (as opposed to text mode).
|
||||
/// This is probably not what you think it is; see
|
||||
/// http://gcc.gnu.org/onlinedocs/libstdc++/27_io/howto.html#3 and
|
||||
/// http://gcc.gnu.org/onlinedocs/libstdc++/27_io/howto.html#7 for more.
|
||||
static const openmode binary = openmode(__ios_flags::_S_bin);
|
||||
|
||||
/// Open for input. Default for @c ifstream and fstream.
|
||||
static const openmode in = openmode(__ios_flags::_S_in);
|
||||
|
||||
/// Open for output. Default for @c ofstream and fstream.
|
||||
static const openmode out = openmode(__ios_flags::_S_out);
|
||||
|
||||
/// Open for input. Default for @c ofstream.
|
||||
static const openmode trunc = openmode(__ios_flags::_S_trunc);
|
||||
|
||||
// 27.4.2.1.5 Type ios_base::seekdir
|
||||
/**
|
||||
* @brief This is an enumerated type.
|
||||
*
|
||||
* @c "_Ios_Seekdir" is implementation-defined. Defined values
|
||||
* of type seekdir are:
|
||||
* - beg
|
||||
* - cur, equivalent to @c SEEK_CUR in the C standard library.
|
||||
* - end, equivalent to @c SEEK_END in the C standard library.
|
||||
*/
|
||||
typedef _Ios_Seekdir seekdir;
|
||||
|
||||
/// Request a seek relative to the beginning of the stream.
|
||||
static const seekdir beg = seekdir(0);
|
||||
|
||||
/// Request a seek relative to the current position within the sequence.
|
||||
static const seekdir cur = seekdir(SEEK_CUR);
|
||||
|
||||
/// Request a seek relative to the current end of the sequence.
|
||||
static const seekdir end = seekdir(SEEK_END);
|
||||
|
||||
#ifdef _GLIBCXX_DEPRECATED
|
||||
// Annex D.6
|
||||
typedef int io_state;
|
||||
typedef int open_mode;
|
||||
typedef int seek_dir;
|
||||
|
||||
typedef std::streampos streampos;
|
||||
typedef std::streamoff streamoff;
|
||||
#endif
|
||||
|
||||
// Callbacks;
|
||||
/**
|
||||
* @brief The set of events that may be passed to an event callback.
|
||||
*
|
||||
* erase_event is used during ~ios() and copyfmt(). imbue_event is used
|
||||
* during imbue(). copyfmt_event is used during copyfmt().
|
||||
*/
|
||||
enum event
|
||||
{
|
||||
erase_event,
|
||||
imbue_event,
|
||||
copyfmt_event
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief The type of an event callback function.
|
||||
* @param event One of the members of the event enum.
|
||||
* @param ios_base Reference to the ios_base object.
|
||||
* @param int The integer provided when the callback was registered.
|
||||
*
|
||||
* Event callbacks are user defined functions that get called during
|
||||
* several ios_base and basic_ios functions, specifically imbue(),
|
||||
* copyfmt(), and ~ios().
|
||||
*/
|
||||
typedef void (*event_callback) (event, ios_base&, int);
|
||||
|
||||
/**
|
||||
* @brief Add the callback __fn with parameter __index.
|
||||
* @param __fn The function to add.
|
||||
* @param __index The integer to pass to the function when invoked.
|
||||
*
|
||||
* Registers a function as an event callback with an integer parameter to
|
||||
* be passed to the function when invoked. Multiple copies of the
|
||||
* function are allowed. If there are multiple callbacks, they are
|
||||
* invoked in the order they were registered.
|
||||
*/
|
||||
void
|
||||
register_callback(event_callback __fn, int __index);
|
||||
|
||||
protected:
|
||||
//@{
|
||||
/**
|
||||
* @if maint
|
||||
* ios_base data members (doc me)
|
||||
* @endif
|
||||
*/
|
||||
streamsize _M_precision;
|
||||
streamsize _M_width;
|
||||
fmtflags _M_flags;
|
||||
iostate _M_exception;
|
||||
iostate _M_streambuf_state;
|
||||
//@}
|
||||
|
||||
// 27.4.2.6 Members for callbacks
|
||||
// 27.4.2.6 ios_base callbacks
|
||||
struct _Callback_list
|
||||
{
|
||||
// Data Members
|
||||
_Callback_list* _M_next;
|
||||
ios_base::event_callback _M_fn;
|
||||
int _M_index;
|
||||
_Atomic_word _M_refcount; // 0 means one reference.
|
||||
|
||||
_Callback_list(ios_base::event_callback __fn, int __index,
|
||||
_Callback_list* __cb)
|
||||
: _M_next(__cb), _M_fn(__fn), _M_index(__index), _M_refcount(0) { }
|
||||
|
||||
void
|
||||
_M_add_reference() { __gnu_cxx::__atomic_add(&_M_refcount, 1); }
|
||||
|
||||
// 0 => OK to delete.
|
||||
int
|
||||
_M_remove_reference()
|
||||
{ return __gnu_cxx::__exchange_and_add(&_M_refcount, -1); }
|
||||
};
|
||||
|
||||
_Callback_list* _M_callbacks;
|
||||
|
||||
void
|
||||
_M_call_callbacks(event __ev) throw();
|
||||
|
||||
void
|
||||
_M_dispose_callbacks(void);
|
||||
|
||||
// 27.4.2.5 Members for iword/pword storage
|
||||
struct _Words
|
||||
{
|
||||
void* _M_pword;
|
||||
long _M_iword;
|
||||
_Words() : _M_pword(0), _M_iword(0) { }
|
||||
};
|
||||
|
||||
// Only for failed iword/pword calls.
|
||||
_Words _M_word_zero;
|
||||
|
||||
// Guaranteed storage.
|
||||
// The first 5 iword and pword slots are reserved for internal use.
|
||||
static const int _S_local_word_size = 8;
|
||||
_Words _M_local_word[_S_local_word_size];
|
||||
|
||||
// Allocated storage.
|
||||
int _M_word_size;
|
||||
_Words* _M_word;
|
||||
|
||||
_Words&
|
||||
_M_grow_words(int __index, bool __iword);
|
||||
|
||||
// Members for locale and locale caching.
|
||||
locale _M_ios_locale;
|
||||
|
||||
void
|
||||
_M_init();
|
||||
|
||||
public:
|
||||
|
||||
// 27.4.2.1.6 Class ios_base::Init
|
||||
// Used to initialize standard streams. In theory, g++ could use
|
||||
// -finit-priority to order this stuff correctly without going
|
||||
// through these machinations.
|
||||
class Init
|
||||
{
|
||||
friend class ios_base;
|
||||
public:
|
||||
Init();
|
||||
~Init();
|
||||
|
||||
private:
|
||||
static _Atomic_word _S_refcount;
|
||||
static bool _S_synced_with_stdio;
|
||||
};
|
||||
|
||||
// [27.4.2.2] fmtflags state functions
|
||||
/**
|
||||
* @brief Access to format flags.
|
||||
* @return The format control flags for both input and output.
|
||||
*/
|
||||
inline fmtflags
|
||||
flags() const { return _M_flags; }
|
||||
|
||||
/**
|
||||
* @brief Setting new format flags all at once.
|
||||
* @param fmtfl The new flags to set.
|
||||
* @return The previous format control flags.
|
||||
*
|
||||
* This function overwrites all the format flags with @a fmtfl.
|
||||
*/
|
||||
inline fmtflags
|
||||
flags(fmtflags __fmtfl)
|
||||
{
|
||||
fmtflags __old = _M_flags;
|
||||
_M_flags = __fmtfl;
|
||||
return __old;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Setting new format flags.
|
||||
* @param fmtfl Additional flags to set.
|
||||
* @return The previous format control flags.
|
||||
*
|
||||
* This function sets additional flags in format control. Flags that
|
||||
* were previously set remain set.
|
||||
*/
|
||||
inline fmtflags
|
||||
setf(fmtflags __fmtfl)
|
||||
{
|
||||
fmtflags __old = _M_flags;
|
||||
_M_flags |= __fmtfl;
|
||||
return __old;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Setting new format flags.
|
||||
* @param fmtfl Additional flags to set.
|
||||
* @param mask The flags mask for @a fmtfl.
|
||||
* @return The previous format control flags.
|
||||
*
|
||||
* This function clears @a mask in the format flags, then sets
|
||||
* @a fmtfl @c & @a mask. An example mask is @c ios_base::adjustfield.
|
||||
*/
|
||||
inline fmtflags
|
||||
setf(fmtflags __fmtfl, fmtflags __mask)
|
||||
{
|
||||
fmtflags __old = _M_flags;
|
||||
_M_flags &= ~__mask;
|
||||
_M_flags |= (__fmtfl & __mask);
|
||||
return __old;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Clearing format flags.
|
||||
* @param mask The flags to unset.
|
||||
*
|
||||
* This function clears @a mask in the format flags.
|
||||
*/
|
||||
inline void
|
||||
unsetf(fmtflags __mask) { _M_flags &= ~__mask; }
|
||||
|
||||
/**
|
||||
* @brief Flags access.
|
||||
* @return The precision to generate on certain output operations.
|
||||
*
|
||||
* @if maint
|
||||
* Be careful if you try to give a definition of "precision" here; see
|
||||
* DR 189.
|
||||
* @endif
|
||||
*/
|
||||
inline streamsize
|
||||
precision() const { return _M_precision; }
|
||||
|
||||
/**
|
||||
* @brief Changing flags.
|
||||
* @param prec The new precision value.
|
||||
* @return The previous value of precision().
|
||||
*/
|
||||
inline streamsize
|
||||
precision(streamsize __prec)
|
||||
{
|
||||
streamsize __old = _M_precision;
|
||||
_M_precision = __prec;
|
||||
return __old;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Flags access.
|
||||
* @return The minimum field width to generate on output operations.
|
||||
*
|
||||
* "Minimum field width" refers to the number of characters.
|
||||
*/
|
||||
inline streamsize
|
||||
width() const { return _M_width; }
|
||||
|
||||
/**
|
||||
* @brief Changing flags.
|
||||
* @param wide The new width value.
|
||||
* @return The previous value of width().
|
||||
*/
|
||||
inline streamsize
|
||||
width(streamsize __wide)
|
||||
{
|
||||
streamsize __old = _M_width;
|
||||
_M_width = __wide;
|
||||
return __old;
|
||||
}
|
||||
|
||||
// [27.4.2.4] ios_base static members
|
||||
/**
|
||||
* @brief Interaction with the standard C I/O objects.
|
||||
* @param sync Whether to synchronize or not.
|
||||
* @return True if the standard streams were previously synchronized.
|
||||
*
|
||||
* The synchronization referred to is @e only that between the standard
|
||||
* C facilities (e.g., stdout) and the standard C++ objects (e.g.,
|
||||
* cout). User-declared streams are unaffected. See
|
||||
* http://gcc.gnu.org/onlinedocs/libstdc++/27_io/howto.html#8 for more.
|
||||
*/
|
||||
static bool
|
||||
sync_with_stdio(bool __sync = true);
|
||||
|
||||
// [27.4.2.3] ios_base locale functions
|
||||
/**
|
||||
* @brief Setting a new locale.
|
||||
* @param loc The new locale.
|
||||
* @return The previous locale.
|
||||
*
|
||||
* Sets the new locale for this stream, and then invokes each callback
|
||||
* with imbue_event.
|
||||
*/
|
||||
locale
|
||||
imbue(const locale& __loc);
|
||||
|
||||
/**
|
||||
* @brief Locale access
|
||||
* @return A copy of the current locale.
|
||||
*
|
||||
* If @c imbue(loc) has previously been called, then this function
|
||||
* returns @c loc. Otherwise, it returns a copy of @c std::locale(),
|
||||
* the global C++ locale.
|
||||
*/
|
||||
inline locale
|
||||
getloc() const { return _M_ios_locale; }
|
||||
|
||||
/**
|
||||
* @brief Locale access
|
||||
* @return A reference to the current locale.
|
||||
*
|
||||
* Like getloc above, but returns a reference instead of
|
||||
* generating a copy.
|
||||
*/
|
||||
inline const locale&
|
||||
_M_getloc() const { return _M_ios_locale; }
|
||||
|
||||
// [27.4.2.5] ios_base storage functions
|
||||
/**
|
||||
* @brief Access to unique indices.
|
||||
* @return An integer different from all previous calls.
|
||||
*
|
||||
* This function returns a unique integer every time it is called. It
|
||||
* can be used for any purpose, but is primarily intended to be a unique
|
||||
* index for the iword and pword functions. The expectation is that an
|
||||
* application calls xalloc in order to obtain an index in the iword and
|
||||
* pword arrays that can be used without fear of conflict.
|
||||
*
|
||||
* The implementation maintains a static variable that is incremented and
|
||||
* returned on each invocation. xalloc is guaranteed to return an index
|
||||
* that is safe to use in the iword and pword arrays.
|
||||
*/
|
||||
static int
|
||||
xalloc() throw();
|
||||
|
||||
/**
|
||||
* @brief Access to integer array.
|
||||
* @param __ix Index into the array.
|
||||
* @return A reference to an integer associated with the index.
|
||||
*
|
||||
* The iword function provides access to an array of integers that can be
|
||||
* used for any purpose. The array grows as required to hold the
|
||||
* supplied index. All integers in the array are initialized to 0.
|
||||
*
|
||||
* The implementation reserves several indices. You should use xalloc to
|
||||
* obtain an index that is safe to use. Also note that since the array
|
||||
* can grow dynamically, it is not safe to hold onto the reference.
|
||||
*/
|
||||
inline long&
|
||||
iword(int __ix)
|
||||
{
|
||||
_Words& __word = (__ix < _M_word_size)
|
||||
? _M_word[__ix] : _M_grow_words(__ix, true);
|
||||
return __word._M_iword;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Access to void pointer array.
|
||||
* @param __ix Index into the array.
|
||||
* @return A reference to a void* associated with the index.
|
||||
*
|
||||
* The pword function provides access to an array of pointers that can be
|
||||
* used for any purpose. The array grows as required to hold the
|
||||
* supplied index. All pointers in the array are initialized to 0.
|
||||
*
|
||||
* The implementation reserves several indices. You should use xalloc to
|
||||
* obtain an index that is safe to use. Also note that since the array
|
||||
* can grow dynamically, it is not safe to hold onto the reference.
|
||||
*/
|
||||
inline void*&
|
||||
pword(int __ix)
|
||||
{
|
||||
_Words& __word = (__ix < _M_word_size)
|
||||
? _M_word[__ix] : _M_grow_words(__ix, false);
|
||||
return __word._M_pword;
|
||||
}
|
||||
|
||||
// Destructor
|
||||
/**
|
||||
* Invokes each callback with erase_event. Destroys local storage.
|
||||
*
|
||||
* Note that the ios_base object for the standard streams never gets
|
||||
* destroyed. As a result, any callbacks registered with the standard
|
||||
* streams will not get invoked with erase_event (unless copyfmt is
|
||||
* used).
|
||||
*/
|
||||
virtual ~ios_base();
|
||||
|
||||
protected:
|
||||
ios_base();
|
||||
|
||||
// _GLIBCXX_RESOLVE_LIB_DEFECTS
|
||||
// 50. Copy constructor and assignment operator of ios_base
|
||||
private:
|
||||
ios_base(const ios_base&);
|
||||
|
||||
ios_base&
|
||||
operator=(const ios_base&);
|
||||
};
|
||||
|
||||
// [27.4.5.1] fmtflags manipulators
|
||||
/// Calls base.setf(ios_base::boolalpha).
|
||||
inline ios_base&
|
||||
boolalpha(ios_base& __base)
|
||||
{
|
||||
__base.setf(ios_base::boolalpha);
|
||||
return __base;
|
||||
}
|
||||
|
||||
/// Calls base.unsetf(ios_base::boolalpha).
|
||||
inline ios_base&
|
||||
noboolalpha(ios_base& __base)
|
||||
{
|
||||
__base.unsetf(ios_base::boolalpha);
|
||||
return __base;
|
||||
}
|
||||
|
||||
/// Calls base.setf(ios_base::showbase).
|
||||
inline ios_base&
|
||||
showbase(ios_base& __base)
|
||||
{
|
||||
__base.setf(ios_base::showbase);
|
||||
return __base;
|
||||
}
|
||||
|
||||
/// Calls base.unsetf(ios_base::showbase).
|
||||
inline ios_base&
|
||||
noshowbase(ios_base& __base)
|
||||
{
|
||||
__base.unsetf(ios_base::showbase);
|
||||
return __base;
|
||||
}
|
||||
|
||||
/// Calls base.setf(ios_base::showpoint).
|
||||
inline ios_base&
|
||||
showpoint(ios_base& __base)
|
||||
{
|
||||
__base.setf(ios_base::showpoint);
|
||||
return __base;
|
||||
}
|
||||
|
||||
/// Calls base.unsetf(ios_base::showpoint).
|
||||
inline ios_base&
|
||||
noshowpoint(ios_base& __base)
|
||||
{
|
||||
__base.unsetf(ios_base::showpoint);
|
||||
return __base;
|
||||
}
|
||||
|
||||
/// Calls base.setf(ios_base::showpos).
|
||||
inline ios_base&
|
||||
showpos(ios_base& __base)
|
||||
{
|
||||
__base.setf(ios_base::showpos);
|
||||
return __base;
|
||||
}
|
||||
|
||||
/// Calls base.unsetf(ios_base::showpos).
|
||||
inline ios_base&
|
||||
noshowpos(ios_base& __base)
|
||||
{
|
||||
__base.unsetf(ios_base::showpos);
|
||||
return __base;
|
||||
}
|
||||
|
||||
/// Calls base.setf(ios_base::skipws).
|
||||
inline ios_base&
|
||||
skipws(ios_base& __base)
|
||||
{
|
||||
__base.setf(ios_base::skipws);
|
||||
return __base;
|
||||
}
|
||||
|
||||
/// Calls base.unsetf(ios_base::skipws).
|
||||
inline ios_base&
|
||||
noskipws(ios_base& __base)
|
||||
{
|
||||
__base.unsetf(ios_base::skipws);
|
||||
return __base;
|
||||
}
|
||||
|
||||
/// Calls base.setf(ios_base::uppercase).
|
||||
inline ios_base&
|
||||
uppercase(ios_base& __base)
|
||||
{
|
||||
__base.setf(ios_base::uppercase);
|
||||
return __base;
|
||||
}
|
||||
|
||||
/// Calls base.unsetf(ios_base::uppercase).
|
||||
inline ios_base&
|
||||
nouppercase(ios_base& __base)
|
||||
{
|
||||
__base.unsetf(ios_base::uppercase);
|
||||
return __base;
|
||||
}
|
||||
|
||||
/// Calls base.setf(ios_base::unitbuf).
|
||||
inline ios_base&
|
||||
unitbuf(ios_base& __base)
|
||||
{
|
||||
__base.setf(ios_base::unitbuf);
|
||||
return __base;
|
||||
}
|
||||
|
||||
/// Calls base.unsetf(ios_base::unitbuf).
|
||||
inline ios_base&
|
||||
nounitbuf(ios_base& __base)
|
||||
{
|
||||
__base.unsetf(ios_base::unitbuf);
|
||||
return __base;
|
||||
}
|
||||
|
||||
// [27.4.5.2] adjustfield anipulators
|
||||
/// Calls base.setf(ios_base::internal, ios_base::adjustfield).
|
||||
inline ios_base&
|
||||
internal(ios_base& __base)
|
||||
{
|
||||
__base.setf(ios_base::internal, ios_base::adjustfield);
|
||||
return __base;
|
||||
}
|
||||
|
||||
/// Calls base.setf(ios_base::left, ios_base::adjustfield).
|
||||
inline ios_base&
|
||||
left(ios_base& __base)
|
||||
{
|
||||
__base.setf(ios_base::left, ios_base::adjustfield);
|
||||
return __base;
|
||||
}
|
||||
|
||||
/// Calls base.setf(ios_base::right, ios_base::adjustfield).
|
||||
inline ios_base&
|
||||
right(ios_base& __base)
|
||||
{
|
||||
__base.setf(ios_base::right, ios_base::adjustfield);
|
||||
return __base;
|
||||
}
|
||||
|
||||
// [27.4.5.3] basefield anipulators
|
||||
/// Calls base.setf(ios_base::dec, ios_base::basefield).
|
||||
inline ios_base&
|
||||
dec(ios_base& __base)
|
||||
{
|
||||
__base.setf(ios_base::dec, ios_base::basefield);
|
||||
return __base;
|
||||
}
|
||||
|
||||
/// Calls base.setf(ios_base::hex, ios_base::basefield).
|
||||
inline ios_base&
|
||||
hex(ios_base& __base)
|
||||
{
|
||||
__base.setf(ios_base::hex, ios_base::basefield);
|
||||
return __base;
|
||||
}
|
||||
|
||||
/// Calls base.setf(ios_base::oct, ios_base::basefield).
|
||||
inline ios_base&
|
||||
oct(ios_base& __base)
|
||||
{
|
||||
__base.setf(ios_base::oct, ios_base::basefield);
|
||||
return __base;
|
||||
}
|
||||
|
||||
// [27.4.5.4] floatfield anipulators
|
||||
/// Calls base.setf(ios_base::fixed, ios_base::floatfield).
|
||||
inline ios_base&
|
||||
fixed(ios_base& __base)
|
||||
{
|
||||
__base.setf(ios_base::fixed, ios_base::floatfield);
|
||||
return __base;
|
||||
}
|
||||
|
||||
/// Calls base.setf(ios_base::scientific, ios_base::floatfield).
|
||||
inline ios_base&
|
||||
scientific(ios_base& __base)
|
||||
{
|
||||
__base.setf(ios_base::scientific, ios_base::floatfield);
|
||||
return __base;
|
||||
}
|
||||
} // namespace std
|
||||
|
||||
#endif /* _IOS_BASE_H */
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,377 @@
|
||||
// List implementation (out of line) -*- C++ -*-
|
||||
|
||||
// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 2, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING. If not, write to the Free
|
||||
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
// USA.
|
||||
|
||||
// As a special exception, you may use this file as part of a free software
|
||||
// library without restriction. Specifically, if other files instantiate
|
||||
// templates or use macros or inline functions from this file, or you compile
|
||||
// this file and link it with other files to produce an executable, this
|
||||
// file does not by itself cause the resulting executable to be covered by
|
||||
// the GNU General Public License. This exception does not however
|
||||
// invalidate any other reasons why the executable file might be covered by
|
||||
// the GNU General Public License.
|
||||
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 1994
|
||||
* Hewlett-Packard Company
|
||||
*
|
||||
* Permission to use, copy, modify, distribute and sell this software
|
||||
* and its documentation for any purpose is hereby granted without fee,
|
||||
* provided that the above copyright notice appear in all copies and
|
||||
* that both that copyright notice and this permission notice appear
|
||||
* in supporting documentation. Hewlett-Packard Company makes no
|
||||
* representations about the suitability of this software for any
|
||||
* purpose. It is provided "as is" without express or implied warranty.
|
||||
*
|
||||
*
|
||||
* Copyright (c) 1996,1997
|
||||
* Silicon Graphics Computer Systems, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, distribute and sell this software
|
||||
* and its documentation for any purpose is hereby granted without fee,
|
||||
* provided that the above copyright notice appear in all copies and
|
||||
* that both that copyright notice and this permission notice appear
|
||||
* in supporting documentation. Silicon Graphics makes no
|
||||
* representations about the suitability of this software for any
|
||||
* purpose. It is provided "as is" without express or implied warranty.
|
||||
*/
|
||||
|
||||
/** @file list.tcc
|
||||
* This is an internal header file, included by other library headers.
|
||||
* You should not attempt to use it directly.
|
||||
*/
|
||||
|
||||
#ifndef _LIST_TCC
|
||||
#define _LIST_TCC 1
|
||||
|
||||
namespace _GLIBCXX_STD
|
||||
{
|
||||
template<typename _Tp, typename _Alloc>
|
||||
void
|
||||
_List_base<_Tp,_Alloc>::
|
||||
_M_clear()
|
||||
{
|
||||
typedef _List_node<_Tp> _Node;
|
||||
_Node* __cur = static_cast<_Node*>(this->_M_impl._M_node._M_next);
|
||||
while (__cur != &this->_M_impl._M_node)
|
||||
{
|
||||
_Node* __tmp = __cur;
|
||||
__cur = static_cast<_Node*>(__cur->_M_next);
|
||||
std::_Destroy(&__tmp->_M_data);
|
||||
_M_put_node(__tmp);
|
||||
}
|
||||
}
|
||||
|
||||
template<typename _Tp, typename _Alloc>
|
||||
typename list<_Tp,_Alloc>::iterator
|
||||
list<_Tp,_Alloc>::
|
||||
insert(iterator __position, const value_type& __x)
|
||||
{
|
||||
_Node* __tmp = _M_create_node(__x);
|
||||
__tmp->hook(__position._M_node);
|
||||
return __tmp;
|
||||
}
|
||||
|
||||
template<typename _Tp, typename _Alloc>
|
||||
typename list<_Tp,_Alloc>::iterator
|
||||
list<_Tp,_Alloc>::
|
||||
erase(iterator __position)
|
||||
{
|
||||
iterator __ret = __position._M_node->_M_next;
|
||||
_M_erase(__position);
|
||||
return __ret;
|
||||
}
|
||||
|
||||
template<typename _Tp, typename _Alloc>
|
||||
void
|
||||
list<_Tp,_Alloc>::
|
||||
resize(size_type __new_size, const value_type& __x)
|
||||
{
|
||||
iterator __i = begin();
|
||||
size_type __len = 0;
|
||||
for ( ; __i != end() && __len < __new_size; ++__i, ++__len)
|
||||
;
|
||||
if (__len == __new_size)
|
||||
erase(__i, end());
|
||||
else // __i == end()
|
||||
insert(end(), __new_size - __len, __x);
|
||||
}
|
||||
|
||||
template<typename _Tp, typename _Alloc>
|
||||
list<_Tp,_Alloc>&
|
||||
list<_Tp,_Alloc>::
|
||||
operator=(const list& __x)
|
||||
{
|
||||
if (this != &__x)
|
||||
{
|
||||
iterator __first1 = begin();
|
||||
iterator __last1 = end();
|
||||
const_iterator __first2 = __x.begin();
|
||||
const_iterator __last2 = __x.end();
|
||||
while (__first1 != __last1 && __first2 != __last2)
|
||||
*__first1++ = *__first2++;
|
||||
if (__first2 == __last2)
|
||||
erase(__first1, __last1);
|
||||
else
|
||||
insert(__last1, __first2, __last2);
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
template<typename _Tp, typename _Alloc>
|
||||
void
|
||||
list<_Tp,_Alloc>::
|
||||
_M_fill_assign(size_type __n, const value_type& __val)
|
||||
{
|
||||
iterator __i = begin();
|
||||
for ( ; __i != end() && __n > 0; ++__i, --__n)
|
||||
*__i = __val;
|
||||
if (__n > 0)
|
||||
insert(end(), __n, __val);
|
||||
else
|
||||
erase(__i, end());
|
||||
}
|
||||
|
||||
template<typename _Tp, typename _Alloc>
|
||||
template <typename _InputIterator>
|
||||
void
|
||||
list<_Tp,_Alloc>::
|
||||
_M_assign_dispatch(_InputIterator __first2, _InputIterator __last2,
|
||||
__false_type)
|
||||
{
|
||||
iterator __first1 = begin();
|
||||
iterator __last1 = end();
|
||||
for (; __first1 != __last1 && __first2 != __last2;
|
||||
++__first1, ++__first2)
|
||||
*__first1 = *__first2;
|
||||
if (__first2 == __last2)
|
||||
erase(__first1, __last1);
|
||||
else
|
||||
insert(__last1, __first2, __last2);
|
||||
}
|
||||
|
||||
template<typename _Tp, typename _Alloc>
|
||||
void
|
||||
list<_Tp,_Alloc>::
|
||||
remove(const value_type& __value)
|
||||
{
|
||||
iterator __first = begin();
|
||||
iterator __last = end();
|
||||
while (__first != __last)
|
||||
{
|
||||
iterator __next = __first;
|
||||
++__next;
|
||||
if (*__first == __value)
|
||||
_M_erase(__first);
|
||||
__first = __next;
|
||||
}
|
||||
}
|
||||
|
||||
template<typename _Tp, typename _Alloc>
|
||||
void
|
||||
list<_Tp,_Alloc>::
|
||||
unique()
|
||||
{
|
||||
iterator __first = begin();
|
||||
iterator __last = end();
|
||||
if (__first == __last)
|
||||
return;
|
||||
iterator __next = __first;
|
||||
while (++__next != __last)
|
||||
{
|
||||
if (*__first == *__next)
|
||||
_M_erase(__next);
|
||||
else
|
||||
__first = __next;
|
||||
__next = __first;
|
||||
}
|
||||
}
|
||||
|
||||
template<typename _Tp, typename _Alloc>
|
||||
void
|
||||
list<_Tp,_Alloc>::
|
||||
merge(list& __x)
|
||||
{
|
||||
// _GLIBCXX_RESOLVE_LIB_DEFECTS
|
||||
// 300. list::merge() specification incomplete
|
||||
if (this != &__x)
|
||||
{
|
||||
iterator __first1 = begin();
|
||||
iterator __last1 = end();
|
||||
iterator __first2 = __x.begin();
|
||||
iterator __last2 = __x.end();
|
||||
while (__first1 != __last1 && __first2 != __last2)
|
||||
if (*__first2 < *__first1)
|
||||
{
|
||||
iterator __next = __first2;
|
||||
_M_transfer(__first1, __first2, ++__next);
|
||||
__first2 = __next;
|
||||
}
|
||||
else
|
||||
++__first1;
|
||||
if (__first2 != __last2)
|
||||
_M_transfer(__last1, __first2, __last2);
|
||||
}
|
||||
}
|
||||
|
||||
template<typename _Tp, typename _Alloc>
|
||||
void
|
||||
list<_Tp,_Alloc>::
|
||||
sort()
|
||||
{
|
||||
// Do nothing if the list has length 0 or 1.
|
||||
if (this->_M_impl._M_node._M_next != &this->_M_impl._M_node
|
||||
&& this->_M_impl._M_node._M_next->_M_next != &this->_M_impl._M_node)
|
||||
{
|
||||
list __carry;
|
||||
list __tmp[64];
|
||||
list * __fill = &__tmp[0];
|
||||
list * __counter;
|
||||
|
||||
do
|
||||
{
|
||||
__carry.splice(__carry.begin(), *this, begin());
|
||||
|
||||
for(__counter = &__tmp[0];
|
||||
(__counter != __fill) && !__counter->empty();
|
||||
++__counter)
|
||||
{
|
||||
__counter->merge(__carry);
|
||||
__carry.swap(*__counter);
|
||||
}
|
||||
__carry.swap(*__counter);
|
||||
if (__counter == __fill)
|
||||
++__fill;
|
||||
}
|
||||
while ( !empty() );
|
||||
|
||||
for (__counter = &__tmp[1]; __counter != __fill; ++__counter)
|
||||
__counter->merge( *(__counter-1) );
|
||||
swap( *(__fill-1) );
|
||||
}
|
||||
}
|
||||
|
||||
template<typename _Tp, typename _Alloc>
|
||||
template <typename _Predicate>
|
||||
void
|
||||
list<_Tp,_Alloc>::
|
||||
remove_if(_Predicate __pred)
|
||||
{
|
||||
iterator __first = begin();
|
||||
iterator __last = end();
|
||||
while (__first != __last)
|
||||
{
|
||||
iterator __next = __first;
|
||||
++__next;
|
||||
if (__pred(*__first))
|
||||
_M_erase(__first);
|
||||
__first = __next;
|
||||
}
|
||||
}
|
||||
|
||||
template<typename _Tp, typename _Alloc>
|
||||
template <typename _BinaryPredicate>
|
||||
void
|
||||
list<_Tp,_Alloc>::
|
||||
unique(_BinaryPredicate __binary_pred)
|
||||
{
|
||||
iterator __first = begin();
|
||||
iterator __last = end();
|
||||
if (__first == __last) return;
|
||||
iterator __next = __first;
|
||||
while (++__next != __last)
|
||||
{
|
||||
if (__binary_pred(*__first, *__next))
|
||||
_M_erase(__next);
|
||||
else
|
||||
__first = __next;
|
||||
__next = __first;
|
||||
}
|
||||
}
|
||||
|
||||
template<typename _Tp, typename _Alloc>
|
||||
template <typename _StrictWeakOrdering>
|
||||
void
|
||||
list<_Tp,_Alloc>::
|
||||
merge(list& __x, _StrictWeakOrdering __comp)
|
||||
{
|
||||
// _GLIBCXX_RESOLVE_LIB_DEFECTS
|
||||
// 300. list::merge() specification incomplete
|
||||
if (this != &__x)
|
||||
{
|
||||
iterator __first1 = begin();
|
||||
iterator __last1 = end();
|
||||
iterator __first2 = __x.begin();
|
||||
iterator __last2 = __x.end();
|
||||
while (__first1 != __last1 && __first2 != __last2)
|
||||
if (__comp(*__first2, *__first1))
|
||||
{
|
||||
iterator __next = __first2;
|
||||
_M_transfer(__first1, __first2, ++__next);
|
||||
__first2 = __next;
|
||||
}
|
||||
else
|
||||
++__first1;
|
||||
if (__first2 != __last2)
|
||||
_M_transfer(__last1, __first2, __last2);
|
||||
}
|
||||
}
|
||||
|
||||
template<typename _Tp, typename _Alloc>
|
||||
template <typename _StrictWeakOrdering>
|
||||
void
|
||||
list<_Tp,_Alloc>::
|
||||
sort(_StrictWeakOrdering __comp)
|
||||
{
|
||||
// Do nothing if the list has length 0 or 1.
|
||||
if (this->_M_impl._M_node._M_next != &this->_M_impl._M_node
|
||||
&& this->_M_impl._M_node._M_next->_M_next != &this->_M_impl._M_node)
|
||||
{
|
||||
list __carry;
|
||||
list __tmp[64];
|
||||
list * __fill = &__tmp[0];
|
||||
list * __counter;
|
||||
|
||||
do
|
||||
{
|
||||
__carry.splice(__carry.begin(), *this, begin());
|
||||
|
||||
for(__counter = &__tmp[0];
|
||||
(__counter != __fill) && !__counter->empty();
|
||||
++__counter)
|
||||
{
|
||||
__counter->merge(__carry, __comp);
|
||||
__carry.swap(*__counter);
|
||||
}
|
||||
__carry.swap(*__counter);
|
||||
if (__counter == __fill)
|
||||
++__fill;
|
||||
}
|
||||
while ( !empty() );
|
||||
|
||||
for (__counter = &__tmp[1]; __counter != __fill; ++__counter)
|
||||
__counter->merge( *(__counter-1), __comp );
|
||||
swap( *(__fill-1) );
|
||||
}
|
||||
}
|
||||
} // namespace std
|
||||
|
||||
#endif /* _LIST_TCC */
|
||||
|
||||
@ -0,0 +1,599 @@
|
||||
// Locale support -*- C++ -*-
|
||||
|
||||
// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
|
||||
// Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 2, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING. If not, write to the Free
|
||||
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
// USA.
|
||||
|
||||
// As a special exception, you may use this file as part of a free software
|
||||
// library without restriction. Specifically, if other files instantiate
|
||||
// templates or use macros or inline functions from this file, or you compile
|
||||
// this file and link it with other files to produce an executable, this
|
||||
// file does not by itself cause the resulting executable to be covered by
|
||||
// the GNU General Public License. This exception does not however
|
||||
// invalidate any other reasons why the executable file might be covered by
|
||||
// the GNU General Public License.
|
||||
|
||||
//
|
||||
// ISO C++ 14882: 22.1 Locales
|
||||
//
|
||||
|
||||
/** @file localefwd.h
|
||||
* This is an internal header file, included by other library headers.
|
||||
* You should not attempt to use it directly.
|
||||
*/
|
||||
|
||||
#ifndef _LOCALE_CLASSES_H
|
||||
#define _LOCALE_CLASSES_H 1
|
||||
|
||||
#pragma GCC system_header
|
||||
|
||||
#include <bits/localefwd.h>
|
||||
#include <cstring> // For strcmp.
|
||||
#include <string>
|
||||
#include <bits/atomicity.h>
|
||||
#include <bits/gthr.h>
|
||||
|
||||
namespace std
|
||||
{
|
||||
// 22.1.1 Class locale
|
||||
/**
|
||||
* @brief Container class for localization functionality.
|
||||
*
|
||||
* The locale class is first a class wrapper for C library locales. It is
|
||||
* also an extensible container for user-defined localization. A locale is
|
||||
* a collection of facets that implement various localization features such
|
||||
* as money, time, and number printing.
|
||||
*
|
||||
* Constructing C++ locales does not change the C library locale.
|
||||
*
|
||||
* This library supports efficient construction and copying of locales
|
||||
* through a reference counting implementation of the locale class.
|
||||
*/
|
||||
class locale
|
||||
{
|
||||
public:
|
||||
// Types:
|
||||
/// Definition of locale::category.
|
||||
typedef int category;
|
||||
|
||||
// Forward decls and friends:
|
||||
class facet;
|
||||
class id;
|
||||
class _Impl;
|
||||
|
||||
friend class facet;
|
||||
friend class _Impl;
|
||||
|
||||
template<typename _Facet>
|
||||
friend bool
|
||||
has_facet(const locale&) throw();
|
||||
|
||||
template<typename _Facet>
|
||||
friend const _Facet&
|
||||
use_facet(const locale&);
|
||||
|
||||
template<typename _Cache>
|
||||
friend struct __use_cache;
|
||||
|
||||
//@{
|
||||
/**
|
||||
* @brief Category values.
|
||||
*
|
||||
* The standard category values are none, ctype, numeric, collate, time,
|
||||
* monetary, and messages. They form a bitmask that supports union and
|
||||
* intersection. The category all is the union of these values.
|
||||
*
|
||||
* @if maint
|
||||
* NB: Order must match _S_facet_categories definition in locale.cc
|
||||
* @endif
|
||||
*/
|
||||
static const category none = 0;
|
||||
static const category ctype = 1L << 0;
|
||||
static const category numeric = 1L << 1;
|
||||
static const category collate = 1L << 2;
|
||||
static const category time = 1L << 3;
|
||||
static const category monetary = 1L << 4;
|
||||
static const category messages = 1L << 5;
|
||||
static const category all = (ctype | numeric | collate |
|
||||
time | monetary | messages);
|
||||
//@}
|
||||
|
||||
// Construct/copy/destroy:
|
||||
|
||||
/**
|
||||
* @brief Default constructor.
|
||||
*
|
||||
* Constructs a copy of the global locale. If no locale has been
|
||||
* explicitly set, this is the "C" locale.
|
||||
*/
|
||||
locale() throw();
|
||||
|
||||
/**
|
||||
* @brief Copy constructor.
|
||||
*
|
||||
* Constructs a copy of @a other.
|
||||
*
|
||||
* @param other The locale to copy.
|
||||
*/
|
||||
locale(const locale& __other) throw();
|
||||
|
||||
/**
|
||||
* @brief Named locale constructor.
|
||||
*
|
||||
* Constructs a copy of the named C library locale.
|
||||
*
|
||||
* @param s Name of the locale to construct.
|
||||
* @throw std::runtime_error if s is null or an undefined locale.
|
||||
*/
|
||||
explicit
|
||||
locale(const char* __s);
|
||||
|
||||
/**
|
||||
* @brief Construct locale with facets from another locale.
|
||||
*
|
||||
* Constructs a copy of the locale @a base. The facets specified by @a
|
||||
* cat are replaced with those from the locale named by @a s. If base is
|
||||
* named, this locale instance will also be named.
|
||||
*
|
||||
* @param base The locale to copy.
|
||||
* @param s Name of the locale to use facets from.
|
||||
* @param cat Set of categories defining the facets to use from s.
|
||||
* @throw std::runtime_error if s is null or an undefined locale.
|
||||
*/
|
||||
locale(const locale& __base, const char* __s, category __cat);
|
||||
|
||||
/**
|
||||
* @brief Construct locale with facets from another locale.
|
||||
*
|
||||
* Constructs a copy of the locale @a base. The facets specified by @a
|
||||
* cat are replaced with those from the locale @a add. If @a base and @a
|
||||
* add are named, this locale instance will also be named.
|
||||
*
|
||||
* @param base The locale to copy.
|
||||
* @param add The locale to use facets from.
|
||||
* @param cat Set of categories defining the facets to use from add.
|
||||
*/
|
||||
locale(const locale& __base, const locale& __add, category __cat);
|
||||
|
||||
/**
|
||||
* @brief Construct locale with another facet.
|
||||
*
|
||||
* Constructs a copy of the locale @a other. The facet @f is added to
|
||||
* @other, replacing an existing facet of type Facet if there is one. If
|
||||
* @f is null, this locale is a copy of @a other.
|
||||
*
|
||||
* @param other The locale to copy.
|
||||
* @param f The facet to add in.
|
||||
*/
|
||||
template<typename _Facet>
|
||||
locale(const locale& __other, _Facet* __f);
|
||||
|
||||
/// Locale destructor.
|
||||
~locale() throw();
|
||||
|
||||
/**
|
||||
* @brief Assignment operator.
|
||||
*
|
||||
* Set this locale to be a copy of @a other.
|
||||
*
|
||||
* @param other The locale to copy.
|
||||
* @return A reference to this locale.
|
||||
*/
|
||||
const locale&
|
||||
operator=(const locale& __other) throw();
|
||||
|
||||
/**
|
||||
* @brief Construct locale with another facet.
|
||||
*
|
||||
* Constructs and returns a new copy of this locale. Adds or replaces an
|
||||
* existing facet of type Facet from the locale @a other into the new
|
||||
* locale.
|
||||
*
|
||||
* @param Facet The facet type to copy from other
|
||||
* @param other The locale to copy from.
|
||||
* @return Newly constructed locale.
|
||||
* @throw std::runtime_error if other has no facet of type Facet.
|
||||
*/
|
||||
template<typename _Facet>
|
||||
locale
|
||||
combine(const locale& __other) const;
|
||||
|
||||
// Locale operations:
|
||||
/**
|
||||
* @brief Return locale name.
|
||||
* @return Locale name or "*" if unnamed.
|
||||
*/
|
||||
string
|
||||
name() const;
|
||||
|
||||
/**
|
||||
* @brief Locale equality.
|
||||
*
|
||||
* @param other The locale to compare against.
|
||||
* @return True if other and this refer to the same locale instance, are
|
||||
* copies, or have the same name. False otherwise.
|
||||
*/
|
||||
bool
|
||||
operator==(const locale& __other) const throw ();
|
||||
|
||||
/**
|
||||
* @brief Locale inequality.
|
||||
*
|
||||
* @param other The locale to compare against.
|
||||
* @return ! (*this == other)
|
||||
*/
|
||||
inline bool
|
||||
operator!=(const locale& __other) const throw ()
|
||||
{ return !(this->operator==(__other)); }
|
||||
|
||||
/**
|
||||
* @brief Compare two strings according to collate.
|
||||
*
|
||||
* Template operator to compare two strings using the compare function of
|
||||
* the collate facet in this locale. One use is to provide the locale to
|
||||
* the sort function. For example, a vector v of strings could be sorted
|
||||
* according to locale loc by doing:
|
||||
* @code
|
||||
* std::sort(v.begin(), v.end(), loc);
|
||||
* @endcode
|
||||
*
|
||||
* @param s1 First string to compare.
|
||||
* @param s2 Second string to compare.
|
||||
* @return True if collate<Char> facet compares s1 < s2, else false.
|
||||
*/
|
||||
template<typename _Char, typename _Traits, typename _Alloc>
|
||||
bool
|
||||
operator()(const basic_string<_Char, _Traits, _Alloc>& __s1,
|
||||
const basic_string<_Char, _Traits, _Alloc>& __s2) const;
|
||||
|
||||
// Global locale objects:
|
||||
/**
|
||||
* @brief Set global locale
|
||||
*
|
||||
* This function sets the global locale to the argument and returns a
|
||||
* copy of the previous global locale. If the argument has a name, it
|
||||
* will also call std::setlocale(LC_ALL, loc.name()).
|
||||
*
|
||||
* @param locale The new locale to make global.
|
||||
* @return Copy of the old global locale.
|
||||
*/
|
||||
static locale
|
||||
global(const locale&);
|
||||
|
||||
/**
|
||||
* @brief Return reference to the "C" locale.
|
||||
*/
|
||||
static const locale&
|
||||
classic();
|
||||
|
||||
private:
|
||||
// The (shared) implementation
|
||||
_Impl* _M_impl;
|
||||
|
||||
// The "C" reference locale
|
||||
static _Impl* _S_classic;
|
||||
|
||||
// Current global locale
|
||||
static _Impl* _S_global;
|
||||
|
||||
// Names of underlying locale categories.
|
||||
// NB: locale::global() has to know how to modify all the
|
||||
// underlying categories, not just the ones required by the C++
|
||||
// standard.
|
||||
static const char* const* const _S_categories;
|
||||
|
||||
// Number of standard categories. For C++, these categories are
|
||||
// collate, ctype, monetary, numeric, time, and messages. These
|
||||
// directly correspond to ISO C99 macros LC_COLLATE, LC_CTYPE,
|
||||
// LC_MONETARY, LC_NUMERIC, and LC_TIME. In addition, POSIX (IEEE
|
||||
// 1003.1-2001) specifies LC_MESSAGES.
|
||||
// In addition to the standard categories, the underlying
|
||||
// operating system is allowed to define extra LC_*
|
||||
// macros. For GNU systems, the following are also valid:
|
||||
// LC_PAPER, LC_NAME, LC_ADDRESS, LC_TELEPHONE, LC_MEASUREMENT,
|
||||
// and LC_IDENTIFICATION.
|
||||
static const size_t _S_categories_size = 6 + _GLIBCXX_NUM_CATEGORIES;
|
||||
|
||||
#ifdef __GTHREADS
|
||||
static __gthread_once_t _S_once;
|
||||
#endif
|
||||
|
||||
explicit
|
||||
locale(_Impl*) throw();
|
||||
|
||||
static void
|
||||
_S_initialize();
|
||||
|
||||
static void
|
||||
_S_initialize_once();
|
||||
|
||||
static category
|
||||
_S_normalize_category(category);
|
||||
|
||||
void
|
||||
_M_coalesce(const locale& __base, const locale& __add, category __cat);
|
||||
};
|
||||
|
||||
|
||||
// 22.1.1.1.2 Class locale::facet
|
||||
/**
|
||||
* @brief Localization functionality base class.
|
||||
*
|
||||
* The facet class is the base class for a localization feature, such as
|
||||
* money, time, and number printing. It provides common support for facets
|
||||
* and reference management.
|
||||
*
|
||||
* Facets may not be copied or assigned.
|
||||
*/
|
||||
class locale::facet
|
||||
{
|
||||
private:
|
||||
friend class locale;
|
||||
friend class locale::_Impl;
|
||||
|
||||
mutable _Atomic_word _M_refcount;
|
||||
|
||||
// Contains data from the underlying "C" library for the classic locale.
|
||||
static __c_locale _S_c_locale;
|
||||
|
||||
// String literal for the name of the classic locale.
|
||||
static const char _S_c_name[2];
|
||||
|
||||
#ifdef __GTHREADS
|
||||
static __gthread_once_t _S_once;
|
||||
#endif
|
||||
|
||||
static void
|
||||
_S_initialize_once();
|
||||
|
||||
protected:
|
||||
/**
|
||||
* @brief Facet constructor.
|
||||
*
|
||||
* This is the constructor provided by the standard. If refs is 0, the
|
||||
* facet is destroyed when the last referencing locale is destroyed.
|
||||
* Otherwise the facet will never be destroyed.
|
||||
*
|
||||
* @param refs The initial value for reference count.
|
||||
*/
|
||||
explicit
|
||||
facet(size_t __refs = 0) throw() : _M_refcount(__refs ? 1 : 0)
|
||||
{ }
|
||||
|
||||
/// Facet destructor.
|
||||
virtual
|
||||
~facet();
|
||||
|
||||
static void
|
||||
_S_create_c_locale(__c_locale& __cloc, const char* __s,
|
||||
__c_locale __old = 0);
|
||||
|
||||
static __c_locale
|
||||
_S_clone_c_locale(__c_locale& __cloc);
|
||||
|
||||
static void
|
||||
_S_destroy_c_locale(__c_locale& __cloc);
|
||||
|
||||
// Returns data from the underlying "C" library data for the
|
||||
// classic locale.
|
||||
static __c_locale
|
||||
_S_get_c_locale();
|
||||
|
||||
static const char*
|
||||
_S_get_c_name();
|
||||
|
||||
private:
|
||||
inline void
|
||||
_M_add_reference() const throw()
|
||||
{ __gnu_cxx::__atomic_add(&_M_refcount, 1); }
|
||||
|
||||
inline void
|
||||
_M_remove_reference() const throw()
|
||||
{
|
||||
if (__gnu_cxx::__exchange_and_add(&_M_refcount, -1) == 1)
|
||||
{
|
||||
try
|
||||
{ delete this; }
|
||||
catch (...)
|
||||
{ }
|
||||
}
|
||||
}
|
||||
|
||||
facet(const facet&); // Not defined.
|
||||
|
||||
void
|
||||
operator=(const facet&); // Not defined.
|
||||
};
|
||||
|
||||
|
||||
// 22.1.1.1.3 Class locale::id
|
||||
/**
|
||||
* @brief Facet ID class.
|
||||
*
|
||||
* The ID class provides facets with an index used to identify them.
|
||||
* Every facet class must define a public static member locale::id, or be
|
||||
* derived from a facet that provides this member, otherwise the facet
|
||||
* cannot be used in a locale. The locale::id ensures that each class
|
||||
* type gets a unique identifier.
|
||||
*/
|
||||
class locale::id
|
||||
{
|
||||
private:
|
||||
friend class locale;
|
||||
friend class locale::_Impl;
|
||||
|
||||
template<typename _Facet>
|
||||
friend const _Facet&
|
||||
use_facet(const locale&);
|
||||
|
||||
template<typename _Facet>
|
||||
friend bool
|
||||
has_facet(const locale&) throw ();
|
||||
|
||||
// NB: There is no accessor for _M_index because it may be used
|
||||
// before the constructor is run; the effect of calling a member
|
||||
// function (even an inline) would be undefined.
|
||||
mutable size_t _M_index;
|
||||
|
||||
// Last id number assigned.
|
||||
static _Atomic_word _S_refcount;
|
||||
|
||||
void
|
||||
operator=(const id&); // Not defined.
|
||||
|
||||
id(const id&); // Not defined.
|
||||
|
||||
public:
|
||||
// NB: This class is always a static data member, and thus can be
|
||||
// counted on to be zero-initialized.
|
||||
/// Constructor.
|
||||
id() { }
|
||||
|
||||
size_t
|
||||
_M_id() const;
|
||||
};
|
||||
|
||||
|
||||
// Implementation object for locale.
|
||||
class locale::_Impl
|
||||
{
|
||||
public:
|
||||
// Friends.
|
||||
friend class locale;
|
||||
friend class locale::facet;
|
||||
|
||||
template<typename _Facet>
|
||||
friend bool
|
||||
has_facet(const locale&) throw();
|
||||
|
||||
template<typename _Facet>
|
||||
friend const _Facet&
|
||||
use_facet(const locale&);
|
||||
|
||||
template<typename _Cache>
|
||||
friend struct __use_cache;
|
||||
|
||||
private:
|
||||
// Data Members.
|
||||
_Atomic_word _M_refcount;
|
||||
const facet** _M_facets;
|
||||
size_t _M_facets_size;
|
||||
const facet** _M_caches;
|
||||
char** _M_names;
|
||||
static const locale::id* const _S_id_ctype[];
|
||||
static const locale::id* const _S_id_numeric[];
|
||||
static const locale::id* const _S_id_collate[];
|
||||
static const locale::id* const _S_id_time[];
|
||||
static const locale::id* const _S_id_monetary[];
|
||||
static const locale::id* const _S_id_messages[];
|
||||
static const locale::id* const* const _S_facet_categories[];
|
||||
|
||||
inline void
|
||||
_M_add_reference() throw()
|
||||
{ __gnu_cxx::__atomic_add(&_M_refcount, 1); }
|
||||
|
||||
inline void
|
||||
_M_remove_reference() throw()
|
||||
{
|
||||
if (__gnu_cxx::__exchange_and_add(&_M_refcount, -1) == 1)
|
||||
{
|
||||
try
|
||||
{ delete this; }
|
||||
catch(...)
|
||||
{ }
|
||||
}
|
||||
}
|
||||
|
||||
_Impl(const _Impl&, size_t);
|
||||
_Impl(const char*, size_t);
|
||||
_Impl(size_t) throw();
|
||||
|
||||
~_Impl() throw();
|
||||
|
||||
_Impl(const _Impl&); // Not defined.
|
||||
|
||||
void
|
||||
operator=(const _Impl&); // Not defined.
|
||||
|
||||
inline bool
|
||||
_M_check_same_name()
|
||||
{
|
||||
bool __ret = true;
|
||||
for (size_t __i = 0; __ret && __i < _S_categories_size - 1; ++__i)
|
||||
__ret = std::strcmp(_M_names[__i], _M_names[__i + 1]) == 0;
|
||||
return __ret;
|
||||
}
|
||||
|
||||
void
|
||||
_M_replace_categories(const _Impl*, category);
|
||||
|
||||
void
|
||||
_M_replace_category(const _Impl*, const locale::id* const*);
|
||||
|
||||
void
|
||||
_M_replace_facet(const _Impl*, const locale::id*);
|
||||
|
||||
void
|
||||
_M_install_facet(const locale::id*, const facet*);
|
||||
|
||||
template<typename _Facet>
|
||||
inline void
|
||||
_M_init_facet(_Facet* __facet)
|
||||
{ _M_install_facet(&_Facet::id, __facet); }
|
||||
|
||||
void
|
||||
_M_install_cache(const facet* __cache, size_t __index) throw()
|
||||
{
|
||||
__cache->_M_add_reference();
|
||||
_M_caches[__index] = __cache;
|
||||
}
|
||||
};
|
||||
|
||||
template<typename _Facet>
|
||||
locale::locale(const locale& __other, _Facet* __f)
|
||||
{
|
||||
_M_impl = new _Impl(*__other._M_impl, 1);
|
||||
|
||||
char* _M_tmp_names[_S_categories_size];
|
||||
size_t __i = 0;
|
||||
try
|
||||
{
|
||||
for (; __i < _S_categories_size; ++__i)
|
||||
{
|
||||
_M_tmp_names[__i] = new char[2];
|
||||
std::strcpy(_M_tmp_names[__i], "*");
|
||||
}
|
||||
_M_impl->_M_install_facet(&_Facet::id, __f);
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
_M_impl->_M_remove_reference();
|
||||
for (size_t __j = 0; __j < __i; ++__j)
|
||||
delete [] _M_tmp_names[__j];
|
||||
__throw_exception_again;
|
||||
}
|
||||
|
||||
for (size_t __k = 0; __k < _S_categories_size; ++__k)
|
||||
{
|
||||
delete [] _M_impl->_M_names[__k];
|
||||
_M_impl->_M_names[__k] = _M_tmp_names[__k];
|
||||
}
|
||||
}
|
||||
} // namespace std
|
||||
|
||||
#endif
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,192 @@
|
||||
// Locale support -*- C++ -*-
|
||||
|
||||
// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003
|
||||
// Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 2, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING. If not, write to the Free
|
||||
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
// USA.
|
||||
|
||||
// As a special exception, you may use this file as part of a free software
|
||||
// library without restriction. Specifically, if other files instantiate
|
||||
// templates or use macros or inline functions from this file, or you compile
|
||||
// this file and link it with other files to produce an executable, this
|
||||
// file does not by itself cause the resulting executable to be covered by
|
||||
// the GNU General Public License. This exception does not however
|
||||
// invalidate any other reasons why the executable file might be covered by
|
||||
// the GNU General Public License.
|
||||
|
||||
//
|
||||
// ISO C++ 14882: 22.1 Locales
|
||||
//
|
||||
|
||||
/** @file localefwd.h
|
||||
* This is an internal header file, included by other library headers.
|
||||
* You should not attempt to use it directly.
|
||||
*/
|
||||
|
||||
#ifndef _LOCALE_FWD_H
|
||||
#define _LOCALE_FWD_H 1
|
||||
|
||||
#pragma GCC system_header
|
||||
|
||||
#include <bits/c++config.h>
|
||||
#include <bits/c++locale.h> // Defines __c_locale, config-specific includes
|
||||
#include <iosfwd> // For ostreambuf_iterator, istreambuf_iterator
|
||||
#include <bits/functexcept.h>
|
||||
|
||||
namespace std
|
||||
{
|
||||
// 22.1.1 Locale
|
||||
class locale;
|
||||
|
||||
// 22.1.3 Convenience interfaces
|
||||
template<typename _CharT>
|
||||
inline bool
|
||||
isspace(_CharT, const locale&);
|
||||
|
||||
template<typename _CharT>
|
||||
inline bool
|
||||
isprint(_CharT, const locale&);
|
||||
|
||||
template<typename _CharT>
|
||||
inline bool
|
||||
iscntrl(_CharT, const locale&);
|
||||
|
||||
template<typename _CharT>
|
||||
inline bool
|
||||
isupper(_CharT, const locale&);
|
||||
|
||||
template<typename _CharT>
|
||||
inline bool
|
||||
islower(_CharT, const locale&);
|
||||
|
||||
template<typename _CharT>
|
||||
inline bool
|
||||
isalpha(_CharT, const locale&);
|
||||
|
||||
template<typename _CharT>
|
||||
inline bool
|
||||
isdigit(_CharT, const locale&);
|
||||
|
||||
template<typename _CharT>
|
||||
inline bool
|
||||
ispunct(_CharT, const locale&);
|
||||
|
||||
template<typename _CharT>
|
||||
inline bool
|
||||
isxdigit(_CharT, const locale&);
|
||||
|
||||
template<typename _CharT>
|
||||
inline bool
|
||||
isalnum(_CharT, const locale&);
|
||||
|
||||
template<typename _CharT>
|
||||
inline bool
|
||||
isgraph(_CharT, const locale&);
|
||||
|
||||
template<typename _CharT>
|
||||
inline _CharT
|
||||
toupper(_CharT, const locale&);
|
||||
|
||||
template<typename _CharT>
|
||||
inline _CharT
|
||||
tolower(_CharT, const locale&);
|
||||
|
||||
// 22.2.1 and 22.2.1.3 ctype
|
||||
class ctype_base;
|
||||
template<typename _CharT>
|
||||
class ctype;
|
||||
template<> class ctype<char>;
|
||||
#ifdef _GLIBCXX_USE_WCHAR_T
|
||||
template<> class ctype<wchar_t>;
|
||||
#endif
|
||||
template<typename _CharT>
|
||||
class ctype_byname;
|
||||
// NB: Specialized for char and wchar_t in locale_facets.h.
|
||||
|
||||
class codecvt_base;
|
||||
class __enc_traits;
|
||||
template<typename _InternT, typename _ExternT, typename _StateT>
|
||||
class codecvt;
|
||||
template<> class codecvt<char, char, mbstate_t>;
|
||||
#ifdef _GLIBCXX_USE_WCHAR_T
|
||||
template<> class codecvt<wchar_t, char, mbstate_t>;
|
||||
#endif
|
||||
template<typename _InternT, typename _ExternT, typename _StateT>
|
||||
class codecvt_byname;
|
||||
|
||||
// 22.2.2 and 22.2.3 numeric
|
||||
template<typename _CharT, typename _InIter = istreambuf_iterator<_CharT> >
|
||||
class num_get;
|
||||
template<typename _CharT, typename _OutIter = ostreambuf_iterator<_CharT> >
|
||||
class num_put;
|
||||
template<typename _CharT> class numpunct;
|
||||
template<typename _CharT> class numpunct_byname;
|
||||
|
||||
// 22.2.4 collation
|
||||
template<typename _CharT>
|
||||
class collate;
|
||||
template<typename _CharT> class
|
||||
collate_byname;
|
||||
|
||||
// 22.2.5 date and time
|
||||
class time_base;
|
||||
template<typename _CharT, typename _InIter = istreambuf_iterator<_CharT> >
|
||||
class time_get;
|
||||
template<typename _CharT, typename _InIter = istreambuf_iterator<_CharT> >
|
||||
class time_get_byname;
|
||||
template<typename _CharT, typename _OutIter = ostreambuf_iterator<_CharT> >
|
||||
class time_put;
|
||||
template<typename _CharT, typename _OutIter = ostreambuf_iterator<_CharT> >
|
||||
class time_put_byname;
|
||||
|
||||
// 22.2.6 money
|
||||
class money_base;
|
||||
template<typename _CharT, typename _InIter = istreambuf_iterator<_CharT> >
|
||||
class money_get;
|
||||
template<typename _CharT, typename _OutIter = ostreambuf_iterator<_CharT> >
|
||||
class money_put;
|
||||
template<typename _CharT, bool _Intl = false>
|
||||
class moneypunct;
|
||||
template<typename _CharT, bool _Intl = false>
|
||||
class moneypunct_byname;
|
||||
|
||||
// 22.2.7 message retrieval
|
||||
class messages_base;
|
||||
template<typename _CharT>
|
||||
class messages;
|
||||
template<typename _CharT>
|
||||
class messages_byname;
|
||||
|
||||
template<typename _Facet>
|
||||
bool
|
||||
has_facet(const locale& __loc) throw();
|
||||
|
||||
template<typename _Facet>
|
||||
const _Facet&
|
||||
use_facet(const locale& __loc);
|
||||
|
||||
template<typename _Facet>
|
||||
inline const _Facet&
|
||||
__check_facet(const _Facet* __f)
|
||||
{
|
||||
if (!__f)
|
||||
__throw_bad_cast();
|
||||
return *__f;
|
||||
}
|
||||
} // namespace std
|
||||
|
||||
#endif
|
||||
@ -0,0 +1,209 @@
|
||||
// The template and inlines for the -*- C++ -*- mask_array class.
|
||||
|
||||
// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2004
|
||||
// Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 2, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING. If not, write to the Free
|
||||
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
// USA.
|
||||
|
||||
// As a special exception, you may use this file as part of a free software
|
||||
// library without restriction. Specifically, if other files instantiate
|
||||
// templates or use macros or inline functions from this file, or you compile
|
||||
// this file and link it with other files to produce an executable, this
|
||||
// file does not by itself cause the resulting executable to be covered by
|
||||
// the GNU General Public License. This exception does not however
|
||||
// invalidate any other reasons why the executable file might be covered by
|
||||
// the GNU General Public License.
|
||||
|
||||
// Written by Gabriel Dos Reis <Gabriel.Dos-Reis@DPTMaths.ENS-Cachan.Fr>
|
||||
|
||||
/** @file mask_array.h
|
||||
* This is an internal header file, included by other library headers.
|
||||
* You should not attempt to use it directly.
|
||||
*/
|
||||
|
||||
#ifndef _MASK_ARRAY_H
|
||||
#define _MASK_ARRAY_H 1
|
||||
|
||||
#pragma GCC system_header
|
||||
|
||||
namespace std {
|
||||
|
||||
/**
|
||||
* @brief Reference to selected subset of an array.
|
||||
*
|
||||
* A mask_array is a reference to the actual elements of an array specified
|
||||
* by a bitmask in the form of an array of bool. The way to get a
|
||||
* mask_array is to call operator[](valarray<bool>) on a valarray. The
|
||||
* returned mask_array then permits carrying operations out on the
|
||||
* referenced subset of elements in the original valarray.
|
||||
*
|
||||
* For example, if a mask_array is obtained using the array (false, true,
|
||||
* false, true) as an argument, the mask array has two elements referring
|
||||
* to array[1] and array[3] in the underlying array.
|
||||
*
|
||||
* @param Tp Element type.
|
||||
*/
|
||||
template <class _Tp>
|
||||
class mask_array
|
||||
{
|
||||
public:
|
||||
typedef _Tp value_type;
|
||||
|
||||
// _GLIBCXX_RESOLVE_LIB_DEFECTS
|
||||
// 253. valarray helper functions are almost entirely useless
|
||||
|
||||
/// Copy constructor. Both slices refer to the same underlying array.
|
||||
mask_array (const mask_array&);
|
||||
|
||||
/// Assignment operator. Assigns elements to corresponding elements
|
||||
/// of @a a.
|
||||
mask_array& operator=(const mask_array&);
|
||||
|
||||
void operator=(const valarray<_Tp>&) const;
|
||||
/// Multiply slice elements by corresponding elements of @a v.
|
||||
void operator*=(const valarray<_Tp>&) const;
|
||||
/// Divide slice elements by corresponding elements of @a v.
|
||||
void operator/=(const valarray<_Tp>&) const;
|
||||
/// Modulo slice elements by corresponding elements of @a v.
|
||||
void operator%=(const valarray<_Tp>&) const;
|
||||
/// Add corresponding elements of @a v to slice elements.
|
||||
void operator+=(const valarray<_Tp>&) const;
|
||||
/// Subtract corresponding elements of @a v from slice elements.
|
||||
void operator-=(const valarray<_Tp>&) const;
|
||||
/// Logical xor slice elements with corresponding elements of @a v.
|
||||
void operator^=(const valarray<_Tp>&) const;
|
||||
/// Logical and slice elements with corresponding elements of @a v.
|
||||
void operator&=(const valarray<_Tp>&) const;
|
||||
/// Logical or slice elements with corresponding elements of @a v.
|
||||
void operator|=(const valarray<_Tp>&) const;
|
||||
/// Left shift slice elements by corresponding elements of @a v.
|
||||
void operator<<=(const valarray<_Tp>&) const;
|
||||
/// Right shift slice elements by corresponding elements of @a v.
|
||||
void operator>>=(const valarray<_Tp>&) const;
|
||||
/// Assign all slice elements to @a t.
|
||||
void operator=(const _Tp&) const;
|
||||
|
||||
// ~mask_array ();
|
||||
|
||||
template<class _Dom>
|
||||
void operator=(const _Expr<_Dom,_Tp>&) const;
|
||||
template<class _Dom>
|
||||
void operator*=(const _Expr<_Dom,_Tp>&) const;
|
||||
template<class _Dom>
|
||||
void operator/=(const _Expr<_Dom,_Tp>&) const;
|
||||
template<class _Dom>
|
||||
void operator%=(const _Expr<_Dom,_Tp>&) const;
|
||||
template<class _Dom>
|
||||
void operator+=(const _Expr<_Dom,_Tp>&) const;
|
||||
template<class _Dom>
|
||||
void operator-=(const _Expr<_Dom,_Tp>&) const;
|
||||
template<class _Dom>
|
||||
void operator^=(const _Expr<_Dom,_Tp>&) const;
|
||||
template<class _Dom>
|
||||
void operator&=(const _Expr<_Dom,_Tp>&) const;
|
||||
template<class _Dom>
|
||||
void operator|=(const _Expr<_Dom,_Tp>&) const;
|
||||
template<class _Dom>
|
||||
void operator<<=(const _Expr<_Dom,_Tp>&) const;
|
||||
template<class _Dom>
|
||||
void operator>>=(const _Expr<_Dom,_Tp>&) const;
|
||||
|
||||
private:
|
||||
mask_array(_Array<_Tp>, size_t, _Array<bool>);
|
||||
friend class valarray<_Tp>;
|
||||
|
||||
const size_t _M_sz;
|
||||
const _Array<bool> _M_mask;
|
||||
const _Array<_Tp> _M_array;
|
||||
|
||||
// not implemented
|
||||
mask_array();
|
||||
};
|
||||
|
||||
|
||||
template<typename _Tp>
|
||||
inline mask_array<_Tp>::mask_array(const mask_array<_Tp>& a)
|
||||
: _M_sz(a._M_sz), _M_mask(a._M_mask), _M_array(a._M_array) {}
|
||||
|
||||
template<typename _Tp>
|
||||
inline
|
||||
mask_array<_Tp>::mask_array(_Array<_Tp> __a, size_t __s, _Array<bool> __m)
|
||||
: _M_sz(__s), _M_mask(__m), _M_array(__a) {}
|
||||
|
||||
template<typename _Tp>
|
||||
inline mask_array<_Tp>&
|
||||
mask_array<_Tp>::operator=(const mask_array<_Tp>& __a)
|
||||
{
|
||||
std::__valarray_copy(__a._M_array, __a._M_mask,
|
||||
_M_sz, _M_array, _M_mask);
|
||||
return *this;
|
||||
}
|
||||
|
||||
template<typename _Tp>
|
||||
inline void
|
||||
mask_array<_Tp>::operator=(const _Tp& __t) const
|
||||
{ std::__valarray_fill(_M_array, _M_sz, _M_mask, __t); }
|
||||
|
||||
template<typename _Tp>
|
||||
inline void
|
||||
mask_array<_Tp>::operator=(const valarray<_Tp>& __v) const
|
||||
{ std::__valarray_copy(_Array<_Tp>(__v), __v.size(), _M_array, _M_mask); }
|
||||
|
||||
template<typename _Tp>
|
||||
template<class _Ex>
|
||||
inline void
|
||||
mask_array<_Tp>::operator=(const _Expr<_Ex, _Tp>& __e) const
|
||||
{ std::__valarray_copy(__e, __e.size(), _M_array, _M_mask); }
|
||||
|
||||
#undef _DEFINE_VALARRAY_OPERATOR
|
||||
#define _DEFINE_VALARRAY_OPERATOR(_Op, _Name) \
|
||||
template<typename _Tp> \
|
||||
inline void \
|
||||
mask_array<_Tp>::operator _Op##=(const valarray<_Tp>& __v) const \
|
||||
{ \
|
||||
_Array_augmented_##_Name(_M_array, _M_mask, \
|
||||
_Array<_Tp>(__v), __v.size()); \
|
||||
} \
|
||||
\
|
||||
template<typename _Tp> \
|
||||
template<class _Dom> \
|
||||
inline void \
|
||||
mask_array<_Tp>::operator _Op##=(const _Expr<_Dom, _Tp>& __e) const\
|
||||
{ \
|
||||
_Array_augmented_##_Name(_M_array, _M_mask, __e, __e.size()); \
|
||||
}
|
||||
|
||||
_DEFINE_VALARRAY_OPERATOR(*, __multiplies)
|
||||
_DEFINE_VALARRAY_OPERATOR(/, __divides)
|
||||
_DEFINE_VALARRAY_OPERATOR(%, __modulus)
|
||||
_DEFINE_VALARRAY_OPERATOR(+, __plus)
|
||||
_DEFINE_VALARRAY_OPERATOR(-, __minus)
|
||||
_DEFINE_VALARRAY_OPERATOR(^, __bitwise_xor)
|
||||
_DEFINE_VALARRAY_OPERATOR(&, __bitwise_and)
|
||||
_DEFINE_VALARRAY_OPERATOR(|, __bitwise_or)
|
||||
_DEFINE_VALARRAY_OPERATOR(<<, __shift_left)
|
||||
_DEFINE_VALARRAY_OPERATOR(>>, __shift_right)
|
||||
|
||||
#undef _DEFINE_VALARRAY_OPERATOR
|
||||
|
||||
} // std::
|
||||
|
||||
#endif /* _MASK_ARRAY_H */
|
||||
|
||||
// Local Variables:
|
||||
// mode:c++
|
||||
// End:
|
||||
@ -0,0 +1,696 @@
|
||||
// ostream classes -*- C++ -*-
|
||||
|
||||
// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003
|
||||
// Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 2, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING. If not, write to the Free
|
||||
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
// USA.
|
||||
|
||||
// As a special exception, you may use this file as part of a free software
|
||||
// library without restriction. Specifically, if other files instantiate
|
||||
// templates or use macros or inline functions from this file, or you compile
|
||||
// this file and link it with other files to produce an executable, this
|
||||
// file does not by itself cause the resulting executable to be covered by
|
||||
// the GNU General Public License. This exception does not however
|
||||
// invalidate any other reasons why the executable file might be covered by
|
||||
// the GNU General Public License.
|
||||
|
||||
//
|
||||
// ISO C++ 14882: 27.6.2 Output streams
|
||||
//
|
||||
|
||||
#ifndef _OSTREAM_TCC
|
||||
#define _OSTREAM_TCC 1
|
||||
|
||||
#pragma GCC system_header
|
||||
|
||||
#include <locale>
|
||||
|
||||
namespace std
|
||||
{
|
||||
template<typename _CharT, typename _Traits>
|
||||
basic_ostream<_CharT, _Traits>::sentry::
|
||||
sentry(basic_ostream<_CharT, _Traits>& __os)
|
||||
: _M_os(__os)
|
||||
{
|
||||
// XXX MT
|
||||
if (__os.tie() && __os.good())
|
||||
__os.tie()->flush();
|
||||
|
||||
if (__os.good())
|
||||
_M_ok = true;
|
||||
else
|
||||
{
|
||||
_M_ok = false;
|
||||
__os.setstate(ios_base::failbit);
|
||||
}
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _Traits>
|
||||
basic_ostream<_CharT, _Traits>&
|
||||
basic_ostream<_CharT, _Traits>::
|
||||
operator<<(__ostream_type& (*__pf)(__ostream_type&))
|
||||
{
|
||||
// _GLIBCXX_RESOLVE_LIB_DEFECTS
|
||||
// DR 60. What is a formatted input function?
|
||||
// The inserters for manipulators are *not* formatted output functions.
|
||||
return __pf(*this);
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _Traits>
|
||||
basic_ostream<_CharT, _Traits>&
|
||||
basic_ostream<_CharT, _Traits>::
|
||||
operator<<(__ios_type& (*__pf)(__ios_type&))
|
||||
{
|
||||
// _GLIBCXX_RESOLVE_LIB_DEFECTS
|
||||
// DR 60. What is a formatted input function?
|
||||
// The inserters for manipulators are *not* formatted output functions.
|
||||
__pf(*this);
|
||||
return *this;
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _Traits>
|
||||
basic_ostream<_CharT, _Traits>&
|
||||
basic_ostream<_CharT, _Traits>::
|
||||
operator<<(ios_base& (*__pf)(ios_base&))
|
||||
{
|
||||
// _GLIBCXX_RESOLVE_LIB_DEFECTS
|
||||
// DR 60. What is a formatted input function?
|
||||
// The inserters for manipulators are *not* formatted output functions.
|
||||
__pf(*this);
|
||||
return *this;
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _Traits>
|
||||
basic_ostream<_CharT, _Traits>&
|
||||
basic_ostream<_CharT, _Traits>::
|
||||
operator<<(bool __n)
|
||||
{
|
||||
sentry __cerb(*this);
|
||||
if (__cerb)
|
||||
{
|
||||
ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
|
||||
try
|
||||
{
|
||||
const __num_put_type& __np = __check_facet(this->_M_num_put);
|
||||
if (__np.put(*this, *this, this->fill(), __n).failed())
|
||||
__err |= ios_base::badbit;
|
||||
}
|
||||
catch(...)
|
||||
{ this->_M_setstate(ios_base::badbit); }
|
||||
if (__err)
|
||||
this->setstate(__err);
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _Traits>
|
||||
basic_ostream<_CharT, _Traits>&
|
||||
basic_ostream<_CharT, _Traits>::
|
||||
operator<<(long __n)
|
||||
{
|
||||
sentry __cerb(*this);
|
||||
if (__cerb)
|
||||
{
|
||||
ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
|
||||
try
|
||||
{
|
||||
bool __b = false;
|
||||
char_type __c = this->fill();
|
||||
ios_base::fmtflags __fmt = this->flags() & ios_base::basefield;
|
||||
const __num_put_type& __np = __check_facet(this->_M_num_put);
|
||||
if ((__fmt & ios_base::oct) || (__fmt & ios_base::hex))
|
||||
{
|
||||
unsigned long __l = static_cast<unsigned long>(__n);
|
||||
__b = __np.put(*this, *this, __c, __l).failed();
|
||||
}
|
||||
else
|
||||
__b = __np.put(*this, *this, __c, __n).failed();
|
||||
if (__b)
|
||||
__err |= ios_base::badbit;
|
||||
}
|
||||
catch(...)
|
||||
{ this->_M_setstate(ios_base::badbit); }
|
||||
if (__err)
|
||||
this->setstate(__err);
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _Traits>
|
||||
basic_ostream<_CharT, _Traits>&
|
||||
basic_ostream<_CharT, _Traits>::
|
||||
operator<<(unsigned long __n)
|
||||
{
|
||||
sentry __cerb(*this);
|
||||
if (__cerb)
|
||||
{
|
||||
ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
|
||||
try
|
||||
{
|
||||
const __num_put_type& __np = __check_facet(this->_M_num_put);
|
||||
if (__np.put(*this, *this, this->fill(), __n).failed())
|
||||
__err |= ios_base::badbit;
|
||||
}
|
||||
catch(...)
|
||||
{ this->_M_setstate(ios_base::badbit); }
|
||||
if (__err)
|
||||
this->setstate(__err);
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
#ifdef _GLIBCXX_USE_LONG_LONG
|
||||
template<typename _CharT, typename _Traits>
|
||||
basic_ostream<_CharT, _Traits>&
|
||||
basic_ostream<_CharT, _Traits>::
|
||||
operator<<(long long __n)
|
||||
{
|
||||
sentry __cerb(*this);
|
||||
if (__cerb)
|
||||
{
|
||||
ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
|
||||
try
|
||||
{
|
||||
bool __b = false;
|
||||
char_type __c = this->fill();
|
||||
ios_base::fmtflags __fmt = this->flags() & ios_base::basefield;
|
||||
const __num_put_type& __np = __check_facet(this->_M_num_put);
|
||||
if ((__fmt & ios_base::oct) || (__fmt & ios_base::hex))
|
||||
{
|
||||
unsigned long long __l;
|
||||
__l = static_cast<unsigned long long>(__n);
|
||||
__b = __np.put(*this, *this, __c, __l).failed();
|
||||
}
|
||||
else
|
||||
__b = __np.put(*this, *this, __c, __n).failed();
|
||||
if (__b)
|
||||
__err |= ios_base::badbit;
|
||||
}
|
||||
catch(...)
|
||||
{ this->_M_setstate(ios_base::badbit); }
|
||||
if (__err)
|
||||
this->setstate(__err);
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _Traits>
|
||||
basic_ostream<_CharT, _Traits>&
|
||||
basic_ostream<_CharT, _Traits>::
|
||||
operator<<(unsigned long long __n)
|
||||
{
|
||||
sentry __cerb(*this);
|
||||
if (__cerb)
|
||||
{
|
||||
ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
|
||||
try
|
||||
{
|
||||
const __num_put_type& __np = __check_facet(this->_M_num_put);
|
||||
if (__np.put(*this, *this, this->fill(), __n).failed())
|
||||
__err |= ios_base::badbit;
|
||||
}
|
||||
catch(...)
|
||||
{ this->_M_setstate(ios_base::badbit); }
|
||||
if (__err)
|
||||
this->setstate(__err);
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
#endif
|
||||
|
||||
template<typename _CharT, typename _Traits>
|
||||
basic_ostream<_CharT, _Traits>&
|
||||
basic_ostream<_CharT, _Traits>::
|
||||
operator<<(double __n)
|
||||
{
|
||||
sentry __cerb(*this);
|
||||
if (__cerb)
|
||||
{
|
||||
ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
|
||||
try
|
||||
{
|
||||
const __num_put_type& __np = __check_facet(this->_M_num_put);
|
||||
if (__np.put(*this, *this, this->fill(), __n).failed())
|
||||
__err |= ios_base::badbit;
|
||||
}
|
||||
catch(...)
|
||||
{ this->_M_setstate(ios_base::badbit); }
|
||||
if (__err)
|
||||
this->setstate(__err);
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _Traits>
|
||||
basic_ostream<_CharT, _Traits>&
|
||||
basic_ostream<_CharT, _Traits>::
|
||||
operator<<(long double __n)
|
||||
{
|
||||
sentry __cerb(*this);
|
||||
if (__cerb)
|
||||
{
|
||||
ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
|
||||
try
|
||||
{
|
||||
const __num_put_type& __np = __check_facet(this->_M_num_put);
|
||||
if (__np.put(*this, *this, this->fill(), __n).failed())
|
||||
__err |= ios_base::badbit;
|
||||
}
|
||||
catch(...)
|
||||
{ this->_M_setstate(ios_base::badbit); }
|
||||
if (__err)
|
||||
this->setstate(__err);
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _Traits>
|
||||
basic_ostream<_CharT, _Traits>&
|
||||
basic_ostream<_CharT, _Traits>::
|
||||
operator<<(const void* __n)
|
||||
{
|
||||
sentry __cerb(*this);
|
||||
if (__cerb)
|
||||
{
|
||||
ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
|
||||
try
|
||||
{
|
||||
const __num_put_type& __np = __check_facet(this->_M_num_put);
|
||||
if (__np.put(*this, *this, this->fill(), __n).failed())
|
||||
__err |= ios_base::badbit;
|
||||
}
|
||||
catch(...)
|
||||
{ this->_M_setstate(ios_base::badbit); }
|
||||
if (__err)
|
||||
this->setstate(__err);
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _Traits>
|
||||
basic_ostream<_CharT, _Traits>&
|
||||
basic_ostream<_CharT, _Traits>::
|
||||
operator<<(__streambuf_type* __sbin)
|
||||
{
|
||||
ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
|
||||
sentry __cerb(*this);
|
||||
if (__cerb && __sbin)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (!__copy_streambufs(__sbin, this->rdbuf()))
|
||||
__err |= ios_base::failbit;
|
||||
}
|
||||
catch(...)
|
||||
{ this->_M_setstate(ios_base::failbit); }
|
||||
}
|
||||
else if (!__sbin)
|
||||
__err |= ios_base::badbit;
|
||||
if (__err)
|
||||
this->setstate(__err);
|
||||
return *this;
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _Traits>
|
||||
basic_ostream<_CharT, _Traits>&
|
||||
basic_ostream<_CharT, _Traits>::
|
||||
put(char_type __c)
|
||||
{
|
||||
// _GLIBCXX_RESOLVE_LIB_DEFECTS
|
||||
// DR 60. What is a formatted input function?
|
||||
// basic_ostream::put(char_type) is an unformatted output function.
|
||||
// DR 63. Exception-handling policy for unformatted output.
|
||||
// Unformatted output functions should catch exceptions thrown
|
||||
// from streambuf members.
|
||||
sentry __cerb(*this);
|
||||
if (__cerb)
|
||||
{
|
||||
ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
|
||||
try
|
||||
{
|
||||
int_type __put = this->rdbuf()->sputc(__c);
|
||||
if (traits_type::eq_int_type(__put, traits_type::eof()))
|
||||
__err |= ios_base::badbit;
|
||||
}
|
||||
catch (...)
|
||||
{ this->_M_setstate(ios_base::badbit); }
|
||||
if (__err)
|
||||
this->setstate(__err);
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _Traits>
|
||||
basic_ostream<_CharT, _Traits>&
|
||||
basic_ostream<_CharT, _Traits>::
|
||||
write(const _CharT* __s, streamsize __n)
|
||||
{
|
||||
// _GLIBCXX_RESOLVE_LIB_DEFECTS
|
||||
// DR 60. What is a formatted input function?
|
||||
// basic_ostream::write(const char_type*, streamsize) is an
|
||||
// unformatted output function.
|
||||
// DR 63. Exception-handling policy for unformatted output.
|
||||
// Unformatted output functions should catch exceptions thrown
|
||||
// from streambuf members.
|
||||
sentry __cerb(*this);
|
||||
if (__cerb)
|
||||
{
|
||||
try
|
||||
{ _M_write(__s, __n); }
|
||||
catch (...)
|
||||
{ this->_M_setstate(ios_base::badbit); }
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _Traits>
|
||||
basic_ostream<_CharT, _Traits>&
|
||||
basic_ostream<_CharT, _Traits>::
|
||||
flush()
|
||||
{
|
||||
// _GLIBCXX_RESOLVE_LIB_DEFECTS
|
||||
// DR 60. What is a formatted input function?
|
||||
// basic_ostream::flush() is *not* an unformatted output function.
|
||||
ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
|
||||
try
|
||||
{
|
||||
if (this->rdbuf() && this->rdbuf()->pubsync() == -1)
|
||||
__err |= ios_base::badbit;
|
||||
}
|
||||
catch(...)
|
||||
{ this->_M_setstate(ios_base::badbit); }
|
||||
if (__err)
|
||||
this->setstate(__err);
|
||||
return *this;
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _Traits>
|
||||
typename basic_ostream<_CharT, _Traits>::pos_type
|
||||
basic_ostream<_CharT, _Traits>::
|
||||
tellp()
|
||||
{
|
||||
pos_type __ret = pos_type(-1);
|
||||
try
|
||||
{
|
||||
if (!this->fail())
|
||||
__ret = this->rdbuf()->pubseekoff(0, ios_base::cur, ios_base::out);
|
||||
}
|
||||
catch(...)
|
||||
{ this->_M_setstate(ios_base::badbit); }
|
||||
return __ret;
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _Traits>
|
||||
basic_ostream<_CharT, _Traits>&
|
||||
basic_ostream<_CharT, _Traits>::
|
||||
seekp(pos_type __pos)
|
||||
{
|
||||
ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
|
||||
try
|
||||
{
|
||||
if (!this->fail())
|
||||
{
|
||||
// _GLIBCXX_RESOLVE_LIB_DEFECTS
|
||||
// 136. seekp, seekg setting wrong streams?
|
||||
pos_type __p = this->rdbuf()->pubseekpos(__pos, ios_base::out);
|
||||
|
||||
// 129. Need error indication from seekp() and seekg()
|
||||
if (__p == pos_type(off_type(-1)))
|
||||
__err |= ios_base::failbit;
|
||||
}
|
||||
}
|
||||
catch(...)
|
||||
{ this->_M_setstate(ios_base::badbit); }
|
||||
if (__err)
|
||||
this->setstate(__err);
|
||||
return *this;
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _Traits>
|
||||
basic_ostream<_CharT, _Traits>&
|
||||
basic_ostream<_CharT, _Traits>::
|
||||
seekp(off_type __off, ios_base::seekdir __dir)
|
||||
{
|
||||
ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
|
||||
try
|
||||
{
|
||||
if (!this->fail())
|
||||
{
|
||||
// _GLIBCXX_RESOLVE_LIB_DEFECTS
|
||||
// 136. seekp, seekg setting wrong streams?
|
||||
pos_type __p = this->rdbuf()->pubseekoff(__off, __dir,
|
||||
ios_base::out);
|
||||
|
||||
// 129. Need error indication from seekp() and seekg()
|
||||
if (__p == pos_type(off_type(-1)))
|
||||
__err |= ios_base::failbit;
|
||||
}
|
||||
}
|
||||
catch(...)
|
||||
{ this->_M_setstate(ios_base::badbit); }
|
||||
if (__err)
|
||||
this->setstate(__err);
|
||||
return *this;
|
||||
}
|
||||
|
||||
// 27.6.2.5.4 Character inserters.
|
||||
template<typename _CharT, typename _Traits>
|
||||
basic_ostream<_CharT, _Traits>&
|
||||
operator<<(basic_ostream<_CharT, _Traits>& __out, _CharT __c)
|
||||
{
|
||||
typedef basic_ostream<_CharT, _Traits> __ostream_type;
|
||||
typename __ostream_type::sentry __cerb(__out);
|
||||
if (__cerb)
|
||||
{
|
||||
try
|
||||
{
|
||||
const streamsize __w = __out.width();
|
||||
streamsize __len = 1;
|
||||
_CharT* __cs = &__c;
|
||||
if (__w > __len)
|
||||
{
|
||||
__cs = static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT)
|
||||
* __w));
|
||||
__pad<_CharT, _Traits>::_S_pad(__out, __out.fill(), __cs,
|
||||
&__c, __w, __len, false);
|
||||
__len = __w;
|
||||
}
|
||||
__out._M_write(__cs, __len);
|
||||
__out.width(0);
|
||||
}
|
||||
catch(...)
|
||||
{ __out._M_setstate(ios_base::badbit); }
|
||||
}
|
||||
return __out;
|
||||
}
|
||||
|
||||
// Specializations.
|
||||
template <class _Traits>
|
||||
basic_ostream<char, _Traits>&
|
||||
operator<<(basic_ostream<char, _Traits>& __out, char __c)
|
||||
{
|
||||
typedef basic_ostream<char, _Traits> __ostream_type;
|
||||
typename __ostream_type::sentry __cerb(__out);
|
||||
if (__cerb)
|
||||
{
|
||||
try
|
||||
{
|
||||
const streamsize __w = __out.width();
|
||||
streamsize __len = 1;
|
||||
char* __cs = &__c;
|
||||
if (__w > __len)
|
||||
{
|
||||
__cs = static_cast<char*>(__builtin_alloca(__w));
|
||||
__pad<char, _Traits>::_S_pad(__out, __out.fill(), __cs,
|
||||
&__c, __w, __len, false);
|
||||
__len = __w;
|
||||
}
|
||||
__out._M_write(__cs, __len);
|
||||
__out.width(0);
|
||||
}
|
||||
catch(...)
|
||||
{ __out._M_setstate(ios_base::badbit); }
|
||||
}
|
||||
return __out;
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _Traits>
|
||||
basic_ostream<_CharT, _Traits>&
|
||||
operator<<(basic_ostream<_CharT, _Traits>& __out, const _CharT* __s)
|
||||
{
|
||||
typedef basic_ostream<_CharT, _Traits> __ostream_type;
|
||||
typename __ostream_type::sentry __cerb(__out);
|
||||
if (__cerb && __s)
|
||||
{
|
||||
try
|
||||
{
|
||||
const streamsize __w = __out.width();
|
||||
streamsize __len = static_cast<streamsize>(_Traits::length(__s));
|
||||
if (__w > __len)
|
||||
{
|
||||
_CharT* __cs = static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT)
|
||||
* __w));
|
||||
__pad<_CharT, _Traits>::_S_pad(__out, __out.fill(), __cs,
|
||||
__s, __w, __len, false);
|
||||
__s = __cs;
|
||||
__len = __w;
|
||||
}
|
||||
__out._M_write(__s, __len);
|
||||
__out.width(0);
|
||||
}
|
||||
catch(...)
|
||||
{ __out._M_setstate(ios_base::badbit); }
|
||||
}
|
||||
else if (!__s)
|
||||
__out.setstate(ios_base::badbit);
|
||||
return __out;
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _Traits>
|
||||
basic_ostream<_CharT, _Traits>&
|
||||
operator<<(basic_ostream<_CharT, _Traits>& __out, const char* __s)
|
||||
{
|
||||
typedef basic_ostream<_CharT, _Traits> __ostream_type;
|
||||
// _GLIBCXX_RESOLVE_LIB_DEFECTS
|
||||
// 167. Improper use of traits_type::length()
|
||||
// Note that this is only in 'Review' status.
|
||||
typedef char_traits<char> __traits_type;
|
||||
typename __ostream_type::sentry __cerb(__out);
|
||||
if (__cerb && __s)
|
||||
{
|
||||
size_t __clen = __traits_type::length(__s);
|
||||
_CharT* __ws = static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT)
|
||||
* __clen));
|
||||
for (size_t __i = 0; __i < __clen; ++__i)
|
||||
__ws[__i] = __out.widen(__s[__i]);
|
||||
_CharT* __str = __ws;
|
||||
|
||||
try
|
||||
{
|
||||
const streamsize __w = __out.width();
|
||||
streamsize __len = static_cast<streamsize>(__clen);
|
||||
if (__w > __len)
|
||||
{
|
||||
_CharT* __cs = static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT)
|
||||
* __w));
|
||||
__pad<_CharT, _Traits>::_S_pad(__out, __out.fill(), __cs,
|
||||
__ws, __w, __len, false);
|
||||
__str = __cs;
|
||||
__len = __w;
|
||||
}
|
||||
__out._M_write(__str, __len);
|
||||
__out.width(0);
|
||||
}
|
||||
catch(...)
|
||||
{ __out._M_setstate(ios_base::badbit); }
|
||||
}
|
||||
else if (!__s)
|
||||
__out.setstate(ios_base::badbit);
|
||||
return __out;
|
||||
}
|
||||
|
||||
// Partial specializations.
|
||||
template<class _Traits>
|
||||
basic_ostream<char, _Traits>&
|
||||
operator<<(basic_ostream<char, _Traits>& __out, const char* __s)
|
||||
{
|
||||
typedef basic_ostream<char, _Traits> __ostream_type;
|
||||
typename __ostream_type::sentry __cerb(__out);
|
||||
if (__cerb && __s)
|
||||
{
|
||||
try
|
||||
{
|
||||
const streamsize __w = __out.width();
|
||||
streamsize __len = static_cast<streamsize>(_Traits::length(__s));
|
||||
if (__w > __len)
|
||||
{
|
||||
char* __cs = static_cast<char*>(__builtin_alloca(__w));
|
||||
__pad<char, _Traits>::_S_pad(__out, __out.fill(), __cs,
|
||||
__s, __w, __len, false);
|
||||
__s = __cs;
|
||||
__len = __w;
|
||||
}
|
||||
__out._M_write(__s, __len);
|
||||
__out.width(0);
|
||||
}
|
||||
catch(...)
|
||||
{ __out._M_setstate(ios_base::badbit); }
|
||||
}
|
||||
else if (!__s)
|
||||
__out.setstate(ios_base::badbit);
|
||||
return __out;
|
||||
}
|
||||
|
||||
// 21.3.7.9 basic_string::operator<<
|
||||
template<typename _CharT, typename _Traits, typename _Alloc>
|
||||
basic_ostream<_CharT, _Traits>&
|
||||
operator<<(basic_ostream<_CharT, _Traits>& __out,
|
||||
const basic_string<_CharT, _Traits, _Alloc>& __str)
|
||||
{
|
||||
typedef basic_ostream<_CharT, _Traits> __ostream_type;
|
||||
typename __ostream_type::sentry __cerb(__out);
|
||||
if (__cerb)
|
||||
{
|
||||
const streamsize __w = __out.width();
|
||||
streamsize __len = static_cast<streamsize>(__str.size());
|
||||
const _CharT* __s = __str.data();
|
||||
|
||||
// _GLIBCXX_RESOLVE_LIB_DEFECTS
|
||||
// 25. String operator<< uses width() value wrong
|
||||
if (__w > __len)
|
||||
{
|
||||
_CharT* __cs = static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT) * __w));
|
||||
__pad<_CharT, _Traits>::_S_pad(__out, __out.fill(), __cs, __s,
|
||||
__w, __len, false);
|
||||
__s = __cs;
|
||||
__len = __w;
|
||||
}
|
||||
__out._M_write(__s, __len);
|
||||
__out.width(0);
|
||||
}
|
||||
return __out;
|
||||
}
|
||||
|
||||
// Inhibit implicit instantiations for required instantiations,
|
||||
// which are defined via explicit instantiations elsewhere.
|
||||
// NB: This syntax is a GNU extension.
|
||||
#if _GLIBCXX_EXTERN_TEMPLATE
|
||||
extern template class basic_ostream<char>;
|
||||
extern template ostream& endl(ostream&);
|
||||
extern template ostream& ends(ostream&);
|
||||
extern template ostream& flush(ostream&);
|
||||
extern template ostream& operator<<(ostream&, char);
|
||||
extern template ostream& operator<<(ostream&, unsigned char);
|
||||
extern template ostream& operator<<(ostream&, signed char);
|
||||
extern template ostream& operator<<(ostream&, const char*);
|
||||
extern template ostream& operator<<(ostream&, const unsigned char*);
|
||||
extern template ostream& operator<<(ostream&, const signed char*);
|
||||
|
||||
#ifdef _GLIBCXX_USE_WCHAR_T
|
||||
extern template class basic_ostream<wchar_t>;
|
||||
extern template wostream& endl(wostream&);
|
||||
extern template wostream& ends(wostream&);
|
||||
extern template wostream& flush(wostream&);
|
||||
extern template wostream& operator<<(wostream&, wchar_t);
|
||||
extern template wostream& operator<<(wostream&, char);
|
||||
extern template wostream& operator<<(wostream&, const wchar_t*);
|
||||
extern template wostream& operator<<(wostream&, const char*);
|
||||
#endif
|
||||
#endif
|
||||
} // namespace std
|
||||
|
||||
#endif
|
||||
@ -0,0 +1,215 @@
|
||||
// Position types -*- C++ -*-
|
||||
|
||||
// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2003, 2004
|
||||
// Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 2, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING. If not, write to the Free
|
||||
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
// USA.
|
||||
|
||||
// As a special exception, you may use this file as part of a free software
|
||||
// library without restriction. Specifically, if other files instantiate
|
||||
// templates or use macros or inline functions from this file, or you compile
|
||||
// this file and link it with other files to produce an executable, this
|
||||
// file does not by itself cause the resulting executable to be covered by
|
||||
// the GNU General Public License. This exception does not however
|
||||
// invalidate any other reasons why the executable file might be covered by
|
||||
// the GNU General Public License.
|
||||
|
||||
//
|
||||
// ISO C++ 14882: 27.4.1 - Types
|
||||
// ISO C++ 14882: 27.4.3 - Template class fpos
|
||||
//
|
||||
|
||||
/** @file postypes.h
|
||||
* This is an internal header file, included by other library headers.
|
||||
* You should not attempt to use it directly.
|
||||
*/
|
||||
|
||||
#ifndef _GLIBCXX_POSTYPES_H
|
||||
#define _GLIBCXX_POSTYPES_H 1
|
||||
|
||||
#pragma GCC system_header
|
||||
|
||||
#include <cwchar> // For mbstate_t
|
||||
|
||||
#ifdef _GLIBCXX_HAVE_STDINT_H
|
||||
#include <stdint.h> // For int64_t
|
||||
#endif
|
||||
|
||||
namespace std
|
||||
{
|
||||
// The types streamoff, streampos and wstreampos and the class
|
||||
// template fpos<> are described in clauses 21.1.2, 21.1.3, 27.1.2,
|
||||
// 27.2, 27.4.1, 27.4.3 and D.6. Despite all this verbage, the
|
||||
// behaviour of these types is mostly implementation defined or
|
||||
// unspecified. The behaviour in this implementation is as noted
|
||||
// below.
|
||||
|
||||
/**
|
||||
* @brief Type used by fpos, char_traits<char>, and char_traits<wchar_t>.
|
||||
*
|
||||
* @if maint
|
||||
* In clauses 21.1.3.1 and 27.4.1 streamoff is described as an
|
||||
* implementation defined type.
|
||||
* Note: In versions of GCC up to and including GCC 3.3, streamoff
|
||||
* was typedef long.
|
||||
* @endif
|
||||
*/
|
||||
#ifdef _GLIBCXX_HAVE_INT64_T
|
||||
typedef int64_t streamoff;
|
||||
#else
|
||||
typedef long long streamoff;
|
||||
#endif
|
||||
|
||||
/// Integral type for I/O operation counts and buffer sizes.
|
||||
typedef ptrdiff_t streamsize; // Signed integral type
|
||||
|
||||
template<typename _StateT>
|
||||
class fpos;
|
||||
|
||||
/**
|
||||
* @brief Class representing stream positions.
|
||||
*
|
||||
* The standard places no requirements upon the template parameter StateT.
|
||||
* In this implementation StateT must be DefaultConstructible,
|
||||
* CopyConstructible and Assignable. The standard only requires that fpos
|
||||
* should contain a member of type StateT. In this implementation it also
|
||||
* contains an offset stored as a signed integer.
|
||||
*
|
||||
* @param StateT Type passed to and returned from state().
|
||||
*/
|
||||
template<typename _StateT>
|
||||
class fpos
|
||||
{
|
||||
private:
|
||||
streamoff _M_off;
|
||||
_StateT _M_state;
|
||||
|
||||
public:
|
||||
// The standard doesn't require that fpos objects can be default
|
||||
// constructed. This implementation provides a default
|
||||
// constructor that initializes the offset to 0 and default
|
||||
// constructs the state.
|
||||
fpos()
|
||||
: _M_off(0), _M_state() { }
|
||||
|
||||
// The standard requires that fpos objects can be constructed
|
||||
// from streamoff objects using the constructor syntax, and
|
||||
// fails to give any meaningful semantics. In this
|
||||
// implementation implicit conversion is also allowed, and this
|
||||
// constructor stores the streamoff as the offset and default
|
||||
// constructs the state.
|
||||
/// Construct position from offset.
|
||||
fpos(streamoff __off)
|
||||
: _M_off(__off), _M_state() { }
|
||||
|
||||
/// Convert to streamoff.
|
||||
operator streamoff() const { return _M_off; }
|
||||
|
||||
/// Remember the value of @a st.
|
||||
void
|
||||
state(_StateT __st)
|
||||
{ _M_state = __st; }
|
||||
|
||||
/// Return the last set value of @a st.
|
||||
_StateT
|
||||
state() const
|
||||
{ return _M_state; }
|
||||
|
||||
// The standard only requires that operator== must be an
|
||||
// equivalence relation. In this implementation two fpos<StateT>
|
||||
// objects belong to the same equivalence class if the contained
|
||||
// offsets compare equal.
|
||||
/// Test if equivalent to another position.
|
||||
bool
|
||||
operator==(const fpos& __other) const
|
||||
{ return _M_off == __other._M_off; }
|
||||
|
||||
/// Test if not equivalent to another position.
|
||||
bool
|
||||
operator!=(const fpos& __other) const
|
||||
{ return _M_off != __other._M_off; }
|
||||
|
||||
// The standard requires that this operator must be defined, but
|
||||
// gives no semantics. In this implemenation it just adds it's
|
||||
// argument to the stored offset and returns *this.
|
||||
/// Add offset to this position.
|
||||
fpos&
|
||||
operator+=(streamoff __off)
|
||||
{
|
||||
_M_off += __off;
|
||||
return *this;
|
||||
}
|
||||
|
||||
// The standard requires that this operator must be defined, but
|
||||
// gives no semantics. In this implemenation it just subtracts
|
||||
// it's argument from the stored offset and returns *this.
|
||||
/// Subtract offset from this position.
|
||||
fpos&
|
||||
operator-=(streamoff __off)
|
||||
{
|
||||
_M_off -= __off;
|
||||
return *this;
|
||||
}
|
||||
|
||||
// The standard requires that this operator must be defined, but
|
||||
// defines it's semantics only in terms of operator-. In this
|
||||
// implementation it constructs a copy of *this, adds the
|
||||
// argument to that copy using operator+= and then returns the
|
||||
// copy.
|
||||
/// Add position and offset.
|
||||
fpos
|
||||
operator+(streamoff __off) const
|
||||
{
|
||||
fpos __pos(*this);
|
||||
__pos += __off;
|
||||
return __pos;
|
||||
}
|
||||
|
||||
// The standard requires that this operator must be defined, but
|
||||
// defines it's semantics only in terms of operator+. In this
|
||||
// implementation it constructs a copy of *this, subtracts the
|
||||
// argument from that copy using operator-= and then returns the
|
||||
// copy.
|
||||
/// Subtract offset from position.
|
||||
fpos
|
||||
operator-(streamoff __off) const
|
||||
{
|
||||
fpos __pos(*this);
|
||||
__pos -= __off;
|
||||
return __pos;
|
||||
}
|
||||
|
||||
// The standard requires that this operator must be defined, but
|
||||
// defines it's semantics only in terms of operator+. In this
|
||||
// implementation it returns the difference between the offset
|
||||
// stored in *this and in the argument.
|
||||
/// Subtract position to return offset.
|
||||
streamoff
|
||||
operator-(const fpos& __other) const
|
||||
{ return _M_off - __other._M_off; }
|
||||
};
|
||||
|
||||
// Clauses 21.1.3.1 and 21.1.3.2 describe streampos and wstreampos
|
||||
// as implementation defined types, but clause 27.2 requires that
|
||||
// they must both be typedefs for fpos<mbstate_t>
|
||||
/// File position for char streams.
|
||||
typedef fpos<mbstate_t> streampos;
|
||||
/// File position for wchar_t streams.
|
||||
typedef fpos<mbstate_t> wstreampos;
|
||||
} // namespace std
|
||||
|
||||
#endif
|
||||
@ -0,0 +1,273 @@
|
||||
// The template and inlines for the -*- C++ -*- slice_array class.
|
||||
|
||||
// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2004
|
||||
// Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 2, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING. If not, write to the Free
|
||||
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
// USA.
|
||||
|
||||
// As a special exception, you may use this file as part of a free software
|
||||
// library without restriction. Specifically, if other files instantiate
|
||||
// templates or use macros or inline functions from this file, or you compile
|
||||
// this file and link it with other files to produce an executable, this
|
||||
// file does not by itself cause the resulting executable to be covered by
|
||||
// the GNU General Public License. This exception does not however
|
||||
// invalidate any other reasons why the executable file might be covered by
|
||||
// the GNU General Public License.
|
||||
|
||||
// Written by Gabriel Dos Reis <Gabriel.Dos-Reis@DPTMaths.ENS-Cachan.Fr>
|
||||
|
||||
/** @file slice_array.h
|
||||
* This is an internal header file, included by other library headers.
|
||||
* You should not attempt to use it directly.
|
||||
*/
|
||||
|
||||
#ifndef _SLICE_ARRAY_H
|
||||
#define _SLICE_ARRAY_H 1
|
||||
|
||||
#pragma GCC system_header
|
||||
|
||||
namespace std
|
||||
{
|
||||
/**
|
||||
* @brief Class defining one-dimensional subset of an array.
|
||||
*
|
||||
* The slice class represents a one-dimensional subset of an array,
|
||||
* specified by three parameters: start offset, size, and stride. The
|
||||
* start offset is the index of the first element of the array that is part
|
||||
* of the subset. The size is the total number of elements in the subset.
|
||||
* Stride is the distance between each successive array element to include
|
||||
* in the subset.
|
||||
*
|
||||
* For example, with an array of size 10, and a slice with offset 1, size 3
|
||||
* and stride 2, the subset consists of array elements 1, 3, and 5.
|
||||
*/
|
||||
class slice
|
||||
{
|
||||
public:
|
||||
/// Construct an empty slice.
|
||||
slice();
|
||||
|
||||
/**
|
||||
* @brief Construct a slice.
|
||||
*
|
||||
* @param o Offset in array of first element.
|
||||
* @param d Number of elements in slice.
|
||||
* @param s Stride between array elements.
|
||||
*/
|
||||
slice(size_t, size_t, size_t);
|
||||
|
||||
/// Return array offset of first slice element.
|
||||
size_t start() const;
|
||||
/// Return size of slice.
|
||||
size_t size() const;
|
||||
/// Return array stride of slice.
|
||||
size_t stride() const;
|
||||
|
||||
private:
|
||||
size_t _M_off; // offset
|
||||
size_t _M_sz; // size
|
||||
size_t _M_st; // stride unit
|
||||
};
|
||||
|
||||
// The default constructor constructor is not required to initialize
|
||||
// data members with any meaningful values, so we choose to do nothing.
|
||||
inline
|
||||
slice::slice() {}
|
||||
|
||||
inline
|
||||
slice::slice(size_t __o, size_t __d, size_t __s)
|
||||
: _M_off(__o), _M_sz(__d), _M_st(__s) {}
|
||||
|
||||
inline size_t
|
||||
slice::start() const
|
||||
{ return _M_off; }
|
||||
|
||||
inline size_t
|
||||
slice::size() const
|
||||
{ return _M_sz; }
|
||||
|
||||
inline size_t
|
||||
slice::stride() const
|
||||
{ return _M_st; }
|
||||
|
||||
/**
|
||||
* @brief Reference to one-dimensional subset of an array.
|
||||
*
|
||||
* A slice_array is a reference to the actual elements of an array
|
||||
* specified by a slice. The way to get a slice_array is to call
|
||||
* operator[](slice) on a valarray. The returned slice_array then permits
|
||||
* carrying operations out on the referenced subset of elements in the
|
||||
* original valarray. For example, operator+=(valarray) will add values
|
||||
* to the subset of elements in the underlying valarray this slice_array
|
||||
* refers to.
|
||||
*
|
||||
* @param Tp Element type.
|
||||
*/
|
||||
template<typename _Tp>
|
||||
class slice_array
|
||||
{
|
||||
public:
|
||||
typedef _Tp value_type;
|
||||
|
||||
// _GLIBCXX_RESOLVE_LIB_DEFECTS
|
||||
// 253. valarray helper functions are almost entirely useless
|
||||
|
||||
/// Copy constructor. Both slices refer to the same underlying array.
|
||||
slice_array(const slice_array&);
|
||||
|
||||
/// Assignment operator. Assigns slice elements to corresponding
|
||||
/// elements of @a a.
|
||||
slice_array& operator=(const slice_array&);
|
||||
|
||||
/// Assign slice elements to corresponding elements of @a v.
|
||||
void operator=(const valarray<_Tp>&) const;
|
||||
/// Multiply slice elements by corresponding elements of @a v.
|
||||
void operator*=(const valarray<_Tp>&) const;
|
||||
/// Divide slice elements by corresponding elements of @a v.
|
||||
void operator/=(const valarray<_Tp>&) const;
|
||||
/// Modulo slice elements by corresponding elements of @a v.
|
||||
void operator%=(const valarray<_Tp>&) const;
|
||||
/// Add corresponding elements of @a v to slice elements.
|
||||
void operator+=(const valarray<_Tp>&) const;
|
||||
/// Subtract corresponding elements of @a v from slice elements.
|
||||
void operator-=(const valarray<_Tp>&) const;
|
||||
/// Logical xor slice elements with corresponding elements of @a v.
|
||||
void operator^=(const valarray<_Tp>&) const;
|
||||
/// Logical and slice elements with corresponding elements of @a v.
|
||||
void operator&=(const valarray<_Tp>&) const;
|
||||
/// Logical or slice elements with corresponding elements of @a v.
|
||||
void operator|=(const valarray<_Tp>&) const;
|
||||
/// Left shift slice elements by corresponding elements of @a v.
|
||||
void operator<<=(const valarray<_Tp>&) const;
|
||||
/// Right shift slice elements by corresponding elements of @a v.
|
||||
void operator>>=(const valarray<_Tp>&) const;
|
||||
/// Assign all slice elements to @a t.
|
||||
void operator=(const _Tp &) const;
|
||||
// ~slice_array ();
|
||||
|
||||
template<class _Dom>
|
||||
void operator=(const _Expr<_Dom,_Tp>&) const;
|
||||
template<class _Dom>
|
||||
void operator*=(const _Expr<_Dom,_Tp>&) const;
|
||||
template<class _Dom>
|
||||
void operator/=(const _Expr<_Dom,_Tp>&) const;
|
||||
template<class _Dom>
|
||||
void operator%=(const _Expr<_Dom,_Tp>&) const;
|
||||
template<class _Dom>
|
||||
void operator+=(const _Expr<_Dom,_Tp>&) const;
|
||||
template<class _Dom>
|
||||
void operator-=(const _Expr<_Dom,_Tp>&) const;
|
||||
template<class _Dom>
|
||||
void operator^=(const _Expr<_Dom,_Tp>&) const;
|
||||
template<class _Dom>
|
||||
void operator&=(const _Expr<_Dom,_Tp>&) const;
|
||||
template<class _Dom>
|
||||
void operator|=(const _Expr<_Dom,_Tp>&) const;
|
||||
template<class _Dom>
|
||||
void operator<<=(const _Expr<_Dom,_Tp>&) const;
|
||||
template<class _Dom>
|
||||
void operator>>=(const _Expr<_Dom,_Tp>&) const;
|
||||
|
||||
private:
|
||||
friend class valarray<_Tp>;
|
||||
slice_array(_Array<_Tp>, const slice&);
|
||||
|
||||
const size_t _M_sz;
|
||||
const size_t _M_stride;
|
||||
const _Array<_Tp> _M_array;
|
||||
|
||||
// not implemented
|
||||
slice_array();
|
||||
};
|
||||
|
||||
template<typename _Tp>
|
||||
inline
|
||||
slice_array<_Tp>::slice_array(_Array<_Tp> __a, const slice& __s)
|
||||
: _M_sz(__s.size()), _M_stride(__s.stride()),
|
||||
_M_array(__a.begin() + __s.start()) {}
|
||||
|
||||
template<typename _Tp>
|
||||
inline
|
||||
slice_array<_Tp>::slice_array(const slice_array<_Tp>& a)
|
||||
: _M_sz(a._M_sz), _M_stride(a._M_stride), _M_array(a._M_array) {}
|
||||
|
||||
// template<typename _Tp>
|
||||
// inline slice_array<_Tp>::~slice_array () {}
|
||||
|
||||
template<typename _Tp>
|
||||
inline slice_array<_Tp>&
|
||||
slice_array<_Tp>::operator=(const slice_array<_Tp>& __a)
|
||||
{
|
||||
std::__valarray_copy(__a._M_array, __a._M_sz, __a._M_stride,
|
||||
_M_array, _M_stride);
|
||||
return *this;
|
||||
}
|
||||
|
||||
template<typename _Tp>
|
||||
inline void
|
||||
slice_array<_Tp>::operator=(const _Tp& __t) const
|
||||
{ std::__valarray_fill(_M_array, _M_sz, _M_stride, __t); }
|
||||
|
||||
template<typename _Tp>
|
||||
inline void
|
||||
slice_array<_Tp>::operator=(const valarray<_Tp>& __v) const
|
||||
{ std::__valarray_copy(_Array<_Tp>(__v), _M_array, _M_sz, _M_stride); }
|
||||
|
||||
template<typename _Tp>
|
||||
template<class _Dom>
|
||||
inline void
|
||||
slice_array<_Tp>::operator=(const _Expr<_Dom,_Tp>& __e) const
|
||||
{ std::__valarray_copy(__e, _M_sz, _M_array, _M_stride); }
|
||||
|
||||
#undef _DEFINE_VALARRAY_OPERATOR
|
||||
#define _DEFINE_VALARRAY_OPERATOR(_Op,_Name) \
|
||||
template<typename _Tp> \
|
||||
inline void \
|
||||
slice_array<_Tp>::operator _Op##=(const valarray<_Tp>& __v) const \
|
||||
{ \
|
||||
_Array_augmented_##_Name(_M_array, _M_sz, _M_stride, _Array<_Tp>(__v));\
|
||||
} \
|
||||
\
|
||||
template<typename _Tp> \
|
||||
template<class _Dom> \
|
||||
inline void \
|
||||
slice_array<_Tp>::operator _Op##=(const _Expr<_Dom,_Tp>& __e) const\
|
||||
{ \
|
||||
_Array_augmented_##_Name(_M_array, _M_stride, __e, _M_sz); \
|
||||
}
|
||||
|
||||
|
||||
_DEFINE_VALARRAY_OPERATOR(*, __multiplies)
|
||||
_DEFINE_VALARRAY_OPERATOR(/, __divides)
|
||||
_DEFINE_VALARRAY_OPERATOR(%, __modulus)
|
||||
_DEFINE_VALARRAY_OPERATOR(+, __plus)
|
||||
_DEFINE_VALARRAY_OPERATOR(-, __minus)
|
||||
_DEFINE_VALARRAY_OPERATOR(^, __bitwise_xor)
|
||||
_DEFINE_VALARRAY_OPERATOR(&, __bitwise_and)
|
||||
_DEFINE_VALARRAY_OPERATOR(|, __bitwise_or)
|
||||
_DEFINE_VALARRAY_OPERATOR(<<, __shift_left)
|
||||
_DEFINE_VALARRAY_OPERATOR(>>, __shift_right)
|
||||
|
||||
#undef _DEFINE_VALARRAY_OPERATOR
|
||||
|
||||
} // std::
|
||||
|
||||
#endif /* _SLICE_ARRAY_H */
|
||||
|
||||
// Local Variables:
|
||||
// mode:c++
|
||||
// End:
|
||||
@ -0,0 +1,223 @@
|
||||
// String based streams -*- C++ -*-
|
||||
|
||||
// Copyright (C) 1997, 1998, 1999, 2001, 2002, 2003
|
||||
// Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 2, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING. If not, write to the Free
|
||||
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
// USA.
|
||||
|
||||
// As a special exception, you may use this file as part of a free software
|
||||
// library without restriction. Specifically, if other files instantiate
|
||||
// templates or use macros or inline functions from this file, or you compile
|
||||
// this file and link it with other files to produce an executable, this
|
||||
// file does not by itself cause the resulting executable to be covered by
|
||||
// the GNU General Public License. This exception does not however
|
||||
// invalidate any other reasons why the executable file might be covered by
|
||||
// the GNU General Public License.
|
||||
|
||||
//
|
||||
// ISO C++ 14882: 27.7 String-based streams
|
||||
//
|
||||
|
||||
#ifndef _SSTREAM_TCC
|
||||
#define _SSTREAM_TCC 1
|
||||
|
||||
#pragma GCC system_header
|
||||
|
||||
#include <sstream>
|
||||
|
||||
namespace std
|
||||
{
|
||||
template <class _CharT, class _Traits, class _Alloc>
|
||||
typename basic_stringbuf<_CharT, _Traits, _Alloc>::int_type
|
||||
basic_stringbuf<_CharT, _Traits, _Alloc>::
|
||||
pbackfail(int_type __c)
|
||||
{
|
||||
int_type __ret = traits_type::eof();
|
||||
const bool __testeof = traits_type::eq_int_type(__c, __ret);
|
||||
|
||||
if (this->eback() < this->gptr())
|
||||
{
|
||||
const bool __testeq = traits_type::eq(traits_type::to_char_type(__c),
|
||||
this->gptr()[-1]);
|
||||
this->gbump(-1);
|
||||
|
||||
// Try to put back __c into input sequence in one of three ways.
|
||||
// Order these tests done in is unspecified by the standard.
|
||||
if (!__testeof && __testeq)
|
||||
__ret = __c;
|
||||
else if (__testeof)
|
||||
__ret = traits_type::not_eof(__c);
|
||||
else
|
||||
{
|
||||
*this->gptr() = traits_type::to_char_type(__c);
|
||||
__ret = __c;
|
||||
}
|
||||
}
|
||||
return __ret;
|
||||
}
|
||||
|
||||
template <class _CharT, class _Traits, class _Alloc>
|
||||
typename basic_stringbuf<_CharT, _Traits, _Alloc>::int_type
|
||||
basic_stringbuf<_CharT, _Traits, _Alloc>::
|
||||
overflow(int_type __c)
|
||||
{
|
||||
const bool __testout = this->_M_mode & ios_base::out;
|
||||
if (__builtin_expect(!__testout, false))
|
||||
return traits_type::eof();
|
||||
|
||||
const bool __testeof = traits_type::eq_int_type(__c, traits_type::eof());
|
||||
if (__builtin_expect(__testeof, false))
|
||||
return traits_type::not_eof(__c);
|
||||
|
||||
// NB: Start ostringstream buffers at 512 chars. This is an
|
||||
// experimental value (pronounced "arbitrary" in some of the
|
||||
// hipper english-speaking countries), and can be changed to
|
||||
// suit particular needs.
|
||||
const __size_type __len = std::max(__size_type(_M_string.capacity() + 1),
|
||||
__size_type(512));
|
||||
const bool __testput = this->pptr() < this->epptr();
|
||||
if (__builtin_expect(!__testput && __len > _M_string.max_size(), false))
|
||||
return traits_type::eof();
|
||||
|
||||
// Try to append __c into output sequence in one of two ways.
|
||||
// Order these tests done in is unspecified by the standard.
|
||||
if (!__testput)
|
||||
{
|
||||
// In virtue of DR 169 (TC) we are allowed to grow more than
|
||||
// one char. That's easy to implement thanks to the exponential
|
||||
// growth policy builtin into basic_string.
|
||||
__string_type __tmp;
|
||||
__tmp.reserve(__len);
|
||||
__tmp.assign(_M_string.data(), this->epptr() - this->pbase());
|
||||
_M_string.swap(__tmp);
|
||||
_M_sync(const_cast<char_type*>(_M_string.data()),
|
||||
this->gptr() - this->eback(), this->pptr() - this->pbase());
|
||||
}
|
||||
return this->sputc(traits_type::to_char_type(__c));
|
||||
}
|
||||
|
||||
template <class _CharT, class _Traits, class _Alloc>
|
||||
typename basic_stringbuf<_CharT, _Traits, _Alloc>::int_type
|
||||
basic_stringbuf<_CharT, _Traits, _Alloc>::
|
||||
underflow()
|
||||
{
|
||||
int_type __ret = traits_type::eof();
|
||||
const bool __testin = this->_M_mode & ios_base::in;
|
||||
if (__testin)
|
||||
{
|
||||
// Update egptr() to match the actual string end.
|
||||
_M_update_egptr();
|
||||
if (this->gptr() < this->egptr())
|
||||
__ret = traits_type::to_int_type(*this->gptr());
|
||||
}
|
||||
return __ret;
|
||||
}
|
||||
|
||||
template <class _CharT, class _Traits, class _Alloc>
|
||||
typename basic_stringbuf<_CharT, _Traits, _Alloc>::pos_type
|
||||
basic_stringbuf<_CharT, _Traits, _Alloc>::
|
||||
seekoff(off_type __off, ios_base::seekdir __way, ios_base::openmode __mode)
|
||||
{
|
||||
pos_type __ret = pos_type(off_type(-1));
|
||||
bool __testin = (ios_base::in & this->_M_mode & __mode) != 0;
|
||||
bool __testout = (ios_base::out & this->_M_mode & __mode) != 0;
|
||||
const bool __testboth = __testin && __testout && __way != ios_base::cur;
|
||||
__testin &= !(__mode & ios_base::out);
|
||||
__testout &= !(__mode & ios_base::in);
|
||||
|
||||
if (_M_string.capacity() && (__testin || __testout || __testboth))
|
||||
{
|
||||
char_type* __beg = __testin ? this->eback() : this->pbase();
|
||||
|
||||
_M_update_egptr();
|
||||
|
||||
off_type __newoffi = 0;
|
||||
off_type __newoffo = 0;
|
||||
if (__way == ios_base::cur)
|
||||
{
|
||||
__newoffi = this->gptr() - __beg;
|
||||
__newoffo = this->pptr() - __beg;
|
||||
}
|
||||
else if (__way == ios_base::end)
|
||||
__newoffo = __newoffi = this->egptr() - __beg;
|
||||
|
||||
if ((__testin || __testboth)
|
||||
&& __newoffi + __off >= 0
|
||||
&& this->egptr() - __beg >= __newoffi + __off)
|
||||
{
|
||||
this->gbump((__beg + __newoffi + __off) - this->gptr());
|
||||
__ret = pos_type(__newoffi);
|
||||
}
|
||||
if ((__testout || __testboth)
|
||||
&& __newoffo + __off >= 0
|
||||
&& this->egptr() - __beg >= __newoffo + __off)
|
||||
{
|
||||
this->pbump((__beg + __newoffo + __off) - this->pptr());
|
||||
__ret = pos_type(__newoffo);
|
||||
}
|
||||
}
|
||||
return __ret;
|
||||
}
|
||||
|
||||
template <class _CharT, class _Traits, class _Alloc>
|
||||
typename basic_stringbuf<_CharT, _Traits, _Alloc>::pos_type
|
||||
basic_stringbuf<_CharT, _Traits, _Alloc>::
|
||||
seekpos(pos_type __sp, ios_base::openmode __mode)
|
||||
{
|
||||
pos_type __ret = pos_type(off_type(-1));
|
||||
if (_M_string.capacity())
|
||||
{
|
||||
off_type __pos (__sp);
|
||||
const bool __testin = (ios_base::in & this->_M_mode & __mode) != 0;
|
||||
const bool __testout = (ios_base::out & this->_M_mode & __mode) != 0;
|
||||
char_type* __beg = __testin ? this->eback() : this->pbase();
|
||||
|
||||
_M_update_egptr();
|
||||
|
||||
const bool __testpos = 0 <= __pos
|
||||
&& __pos <= this->egptr() - __beg;
|
||||
if ((__testin || __testout) && __testpos)
|
||||
{
|
||||
if (__testin)
|
||||
this->gbump((__beg + __pos) - this->gptr());
|
||||
if (__testout)
|
||||
this->pbump((__beg + __pos) - this->pptr());
|
||||
__ret = pos_type(off_type(__pos));
|
||||
}
|
||||
}
|
||||
return __ret;
|
||||
}
|
||||
|
||||
// Inhibit implicit instantiations for required instantiations,
|
||||
// which are defined via explicit instantiations elsewhere.
|
||||
// NB: This syntax is a GNU extension.
|
||||
#if _GLIBCXX_EXTERN_TEMPLATE
|
||||
extern template class basic_stringbuf<char>;
|
||||
extern template class basic_istringstream<char>;
|
||||
extern template class basic_ostringstream<char>;
|
||||
extern template class basic_stringstream<char>;
|
||||
|
||||
#ifdef _GLIBCXX_USE_WCHAR_T
|
||||
extern template class basic_stringbuf<wchar_t>;
|
||||
extern template class basic_istringstream<wchar_t>;
|
||||
extern template class basic_ostringstream<wchar_t>;
|
||||
extern template class basic_stringstream<wchar_t>;
|
||||
#endif
|
||||
#endif
|
||||
} // namespace std
|
||||
|
||||
#endif
|
||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,841 @@
|
||||
// Bits and pieces used in algorithms -*- C++ -*-
|
||||
|
||||
// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 2, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING. If not, write to the Free
|
||||
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
// USA.
|
||||
|
||||
// As a special exception, you may use this file as part of a free software
|
||||
// library without restriction. Specifically, if other files instantiate
|
||||
// templates or use macros or inline functions from this file, or you compile
|
||||
// this file and link it with other files to produce an executable, this
|
||||
// file does not by itself cause the resulting executable to be covered by
|
||||
// the GNU General Public License. This exception does not however
|
||||
// invalidate any other reasons why the executable file might be covered by
|
||||
// the GNU General Public License.
|
||||
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 1994
|
||||
* Hewlett-Packard Company
|
||||
*
|
||||
* Permission to use, copy, modify, distribute and sell this software
|
||||
* and its documentation for any purpose is hereby granted without fee,
|
||||
* provided that the above copyright notice appear in all copies and
|
||||
* that both that copyright notice and this permission notice appear
|
||||
* in supporting documentation. Hewlett-Packard Company makes no
|
||||
* representations about the suitability of this software for any
|
||||
* purpose. It is provided "as is" without express or implied warranty.
|
||||
*
|
||||
*
|
||||
* Copyright (c) 1996-1998
|
||||
* Silicon Graphics Computer Systems, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, distribute and sell this software
|
||||
* and its documentation for any purpose is hereby granted without fee,
|
||||
* provided that the above copyright notice appear in all copies and
|
||||
* that both that copyright notice and this permission notice appear
|
||||
* in supporting documentation. Silicon Graphics makes no
|
||||
* representations about the suitability of this software for any
|
||||
* purpose. It is provided "as is" without express or implied warranty.
|
||||
*/
|
||||
|
||||
/** @file stl_algobase.h
|
||||
* This is an internal header file, included by other library headers.
|
||||
* You should not attempt to use it directly.
|
||||
*/
|
||||
|
||||
#ifndef _ALGOBASE_H
|
||||
#define _ALGOBASE_H 1
|
||||
|
||||
#include <bits/c++config.h>
|
||||
#include <cstring>
|
||||
#include <climits>
|
||||
#include <cstdlib>
|
||||
#include <cstddef>
|
||||
#include <new>
|
||||
#include <iosfwd>
|
||||
#include <bits/stl_pair.h>
|
||||
#include <bits/type_traits.h>
|
||||
#include <bits/stl_iterator_base_types.h>
|
||||
#include <bits/stl_iterator_base_funcs.h>
|
||||
#include <bits/stl_iterator.h>
|
||||
#include <bits/concept_check.h>
|
||||
#include <debug/debug.h>
|
||||
|
||||
namespace std
|
||||
{
|
||||
/**
|
||||
* @brief Swaps the contents of two iterators.
|
||||
* @param a An iterator.
|
||||
* @param b Another iterator.
|
||||
* @return Nothing.
|
||||
*
|
||||
* This function swaps the values pointed to by two iterators, not the
|
||||
* iterators themselves.
|
||||
*/
|
||||
template<typename _ForwardIterator1, typename _ForwardIterator2>
|
||||
inline void
|
||||
iter_swap(_ForwardIterator1 __a, _ForwardIterator2 __b)
|
||||
{
|
||||
typedef typename iterator_traits<_ForwardIterator1>::value_type
|
||||
_ValueType1;
|
||||
typedef typename iterator_traits<_ForwardIterator2>::value_type
|
||||
_ValueType2;
|
||||
|
||||
// concept requirements
|
||||
__glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
|
||||
_ForwardIterator1>)
|
||||
__glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
|
||||
_ForwardIterator2>)
|
||||
__glibcxx_function_requires(_ConvertibleConcept<_ValueType1,
|
||||
_ValueType2>)
|
||||
__glibcxx_function_requires(_ConvertibleConcept<_ValueType2,
|
||||
_ValueType1>)
|
||||
|
||||
const _ValueType1 __tmp = *__a;
|
||||
*__a = *__b;
|
||||
*__b = __tmp;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Swaps two values.
|
||||
* @param a A thing of arbitrary type.
|
||||
* @param b Another thing of arbitrary type.
|
||||
* @return Nothing.
|
||||
*
|
||||
* This is the simple classic generic implementation. It will work on
|
||||
* any type which has a copy constructor and an assignment operator.
|
||||
*/
|
||||
template<typename _Tp>
|
||||
inline void
|
||||
swap(_Tp& __a, _Tp& __b)
|
||||
{
|
||||
// concept requirements
|
||||
__glibcxx_function_requires(_SGIAssignableConcept<_Tp>)
|
||||
|
||||
const _Tp __tmp = __a;
|
||||
__a = __b;
|
||||
__b = __tmp;
|
||||
}
|
||||
|
||||
#undef min
|
||||
#undef max
|
||||
|
||||
/**
|
||||
* @brief This does what you think it does.
|
||||
* @param a A thing of arbitrary type.
|
||||
* @param b Another thing of arbitrary type.
|
||||
* @return The lesser of the parameters.
|
||||
*
|
||||
* This is the simple classic generic implementation. It will work on
|
||||
* temporary expressions, since they are only evaluated once, unlike a
|
||||
* preprocessor macro.
|
||||
*/
|
||||
template<typename _Tp>
|
||||
inline const _Tp&
|
||||
min(const _Tp& __a, const _Tp& __b)
|
||||
{
|
||||
// concept requirements
|
||||
__glibcxx_function_requires(_LessThanComparableConcept<_Tp>)
|
||||
//return __b < __a ? __b : __a;
|
||||
if (__b < __a)
|
||||
return __b;
|
||||
return __a;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This does what you think it does.
|
||||
* @param a A thing of arbitrary type.
|
||||
* @param b Another thing of arbitrary type.
|
||||
* @return The greater of the parameters.
|
||||
*
|
||||
* This is the simple classic generic implementation. It will work on
|
||||
* temporary expressions, since they are only evaluated once, unlike a
|
||||
* preprocessor macro.
|
||||
*/
|
||||
template<typename _Tp>
|
||||
inline const _Tp&
|
||||
max(const _Tp& __a, const _Tp& __b)
|
||||
{
|
||||
// concept requirements
|
||||
__glibcxx_function_requires(_LessThanComparableConcept<_Tp>)
|
||||
//return __a < __b ? __b : __a;
|
||||
if (__a < __b)
|
||||
return __b;
|
||||
return __a;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This does what you think it does.
|
||||
* @param a A thing of arbitrary type.
|
||||
* @param b Another thing of arbitrary type.
|
||||
* @param comp A @link s20_3_3_comparisons comparison functor@endlink.
|
||||
* @return The lesser of the parameters.
|
||||
*
|
||||
* This will work on temporary expressions, since they are only evaluated
|
||||
* once, unlike a preprocessor macro.
|
||||
*/
|
||||
template<typename _Tp, typename _Compare>
|
||||
inline const _Tp&
|
||||
min(const _Tp& __a, const _Tp& __b, _Compare __comp)
|
||||
{
|
||||
//return __comp(__b, __a) ? __b : __a;
|
||||
if (__comp(__b, __a))
|
||||
return __b;
|
||||
return __a;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This does what you think it does.
|
||||
* @param a A thing of arbitrary type.
|
||||
* @param b Another thing of arbitrary type.
|
||||
* @param comp A @link s20_3_3_comparisons comparison functor@endlink.
|
||||
* @return The greater of the parameters.
|
||||
*
|
||||
* This will work on temporary expressions, since they are only evaluated
|
||||
* once, unlike a preprocessor macro.
|
||||
*/
|
||||
template<typename _Tp, typename _Compare>
|
||||
inline const _Tp&
|
||||
max(const _Tp& __a, const _Tp& __b, _Compare __comp)
|
||||
{
|
||||
//return __comp(__a, __b) ? __b : __a;
|
||||
if (__comp(__a, __b))
|
||||
return __b;
|
||||
return __a;
|
||||
}
|
||||
|
||||
// All of these auxiliary functions serve two purposes. (1) Replace
|
||||
// calls to copy with memmove whenever possible. (Memmove, not memcpy,
|
||||
// because the input and output ranges are permitted to overlap.)
|
||||
// (2) If we're using random access iterators, then write the loop as
|
||||
// a for loop with an explicit count.
|
||||
|
||||
template<typename _InputIterator, typename _OutputIterator>
|
||||
inline _OutputIterator
|
||||
__copy(_InputIterator __first, _InputIterator __last,
|
||||
_OutputIterator __result, input_iterator_tag)
|
||||
{
|
||||
for (; __first != __last; ++__result, ++__first)
|
||||
*__result = *__first;
|
||||
return __result;
|
||||
}
|
||||
|
||||
template<typename _RandomAccessIterator, typename _OutputIterator>
|
||||
inline _OutputIterator
|
||||
__copy(_RandomAccessIterator __first, _RandomAccessIterator __last,
|
||||
_OutputIterator __result, random_access_iterator_tag)
|
||||
{
|
||||
typedef typename iterator_traits<_RandomAccessIterator>::difference_type
|
||||
_Distance;
|
||||
for (_Distance __n = __last - __first; __n > 0; --__n)
|
||||
{
|
||||
*__result = *__first;
|
||||
++__first;
|
||||
++__result;
|
||||
}
|
||||
return __result;
|
||||
}
|
||||
|
||||
template<typename _Tp>
|
||||
inline _Tp*
|
||||
__copy_trivial(const _Tp* __first, const _Tp* __last, _Tp* __result)
|
||||
{
|
||||
std::memmove(__result, __first, sizeof(_Tp) * (__last - __first));
|
||||
return __result + (__last - __first);
|
||||
}
|
||||
|
||||
template<typename _InputIterator, typename _OutputIterator>
|
||||
inline _OutputIterator
|
||||
__copy_aux2(_InputIterator __first, _InputIterator __last,
|
||||
_OutputIterator __result, __false_type)
|
||||
{ return std::__copy(__first, __last, __result,
|
||||
std::__iterator_category(__first)); }
|
||||
|
||||
template<typename _InputIterator, typename _OutputIterator>
|
||||
inline _OutputIterator
|
||||
__copy_aux2(_InputIterator __first, _InputIterator __last,
|
||||
_OutputIterator __result, __true_type)
|
||||
{ return std::__copy(__first, __last, __result,
|
||||
std::__iterator_category(__first)); }
|
||||
|
||||
template<typename _Tp>
|
||||
inline _Tp*
|
||||
__copy_aux2(_Tp* __first, _Tp* __last, _Tp* __result, __true_type)
|
||||
{ return std::__copy_trivial(__first, __last, __result); }
|
||||
|
||||
template<typename _Tp>
|
||||
inline _Tp*
|
||||
__copy_aux2(const _Tp* __first, const _Tp* __last, _Tp* __result,
|
||||
__true_type)
|
||||
{ return std::__copy_trivial(__first, __last, __result); }
|
||||
|
||||
template<typename _InputIterator, typename _OutputIterator>
|
||||
inline _OutputIterator
|
||||
__copy_ni2(_InputIterator __first, _InputIterator __last,
|
||||
_OutputIterator __result, __true_type)
|
||||
{
|
||||
typedef typename iterator_traits<_InputIterator>::value_type
|
||||
_ValueType;
|
||||
typedef typename __type_traits<
|
||||
_ValueType>::has_trivial_assignment_operator _Trivial;
|
||||
return _OutputIterator(std::__copy_aux2(__first, __last, __result.base(),
|
||||
_Trivial()));
|
||||
}
|
||||
|
||||
template<typename _InputIterator, typename _OutputIterator>
|
||||
inline _OutputIterator
|
||||
__copy_ni2(_InputIterator __first, _InputIterator __last,
|
||||
_OutputIterator __result, __false_type)
|
||||
{
|
||||
typedef typename iterator_traits<_InputIterator>::value_type _ValueType;
|
||||
typedef typename __type_traits<
|
||||
_ValueType>::has_trivial_assignment_operator _Trivial;
|
||||
return std::__copy_aux2(__first, __last, __result, _Trivial());
|
||||
}
|
||||
|
||||
template<typename _InputIterator, typename _OutputIterator>
|
||||
inline _OutputIterator
|
||||
__copy_ni1(_InputIterator __first, _InputIterator __last,
|
||||
_OutputIterator __result, __true_type)
|
||||
{
|
||||
typedef typename _Is_normal_iterator<_OutputIterator>::_Normal __Normal;
|
||||
return std::__copy_ni2(__first.base(), __last.base(),
|
||||
__result, __Normal());
|
||||
}
|
||||
|
||||
template<typename _InputIterator, typename _OutputIterator>
|
||||
inline _OutputIterator
|
||||
__copy_ni1(_InputIterator __first, _InputIterator __last,
|
||||
_OutputIterator __result, __false_type)
|
||||
{
|
||||
typedef typename _Is_normal_iterator<_OutputIterator>::_Normal __Normal;
|
||||
return std::__copy_ni2(__first, __last, __result, __Normal());
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Copies the range [first,last) into result.
|
||||
* @param first An input iterator.
|
||||
* @param last An input iterator.
|
||||
* @param result An output iterator.
|
||||
* @return result + (first - last)
|
||||
*
|
||||
* This inline function will boil down to a call to @c memmove whenever
|
||||
* possible. Failing that, if random access iterators are passed, then the
|
||||
* loop count will be known (and therefore a candidate for compiler
|
||||
* optimizations such as unrolling). Result may not be contained within
|
||||
* [first,last); the copy_backward function should be used instead.
|
||||
*
|
||||
* Note that the end of the output range is permitted to be contained
|
||||
* within [first,last).
|
||||
*/
|
||||
template<typename _InputIterator, typename _OutputIterator>
|
||||
inline _OutputIterator
|
||||
copy(_InputIterator __first, _InputIterator __last,
|
||||
_OutputIterator __result)
|
||||
{
|
||||
// concept requirements
|
||||
__glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
|
||||
__glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
|
||||
typename iterator_traits<_InputIterator>::value_type>)
|
||||
__glibcxx_requires_valid_range(__first, __last);
|
||||
|
||||
typedef typename _Is_normal_iterator<_InputIterator>::_Normal __Normal;
|
||||
return std::__copy_ni1(__first, __last, __result, __Normal());
|
||||
}
|
||||
|
||||
template<typename _BidirectionalIterator1, typename _BidirectionalIterator2>
|
||||
inline _BidirectionalIterator2
|
||||
__copy_backward(_BidirectionalIterator1 __first,
|
||||
_BidirectionalIterator1 __last,
|
||||
_BidirectionalIterator2 __result,
|
||||
bidirectional_iterator_tag)
|
||||
{
|
||||
while (__first != __last)
|
||||
*--__result = *--__last;
|
||||
return __result;
|
||||
}
|
||||
|
||||
template<typename _RandomAccessIterator, typename _BidirectionalIterator>
|
||||
inline _BidirectionalIterator
|
||||
__copy_backward(_RandomAccessIterator __first, _RandomAccessIterator __last,
|
||||
_BidirectionalIterator __result, random_access_iterator_tag)
|
||||
{
|
||||
typename iterator_traits<_RandomAccessIterator>::difference_type __n;
|
||||
for (__n = __last - __first; __n > 0; --__n)
|
||||
*--__result = *--__last;
|
||||
return __result;
|
||||
}
|
||||
|
||||
|
||||
// This dispatch class is a workaround for compilers that do not
|
||||
// have partial ordering of function templates. All we're doing is
|
||||
// creating a specialization so that we can turn a call to copy_backward
|
||||
// into a memmove whenever possible.
|
||||
template<typename _BidirectionalIterator1, typename _BidirectionalIterator2,
|
||||
typename _BoolType>
|
||||
struct __copy_backward_dispatch
|
||||
{
|
||||
static _BidirectionalIterator2
|
||||
copy(_BidirectionalIterator1 __first, _BidirectionalIterator1 __last,
|
||||
_BidirectionalIterator2 __result)
|
||||
{ return std::__copy_backward(__first, __last, __result,
|
||||
std::__iterator_category(__first)); }
|
||||
};
|
||||
|
||||
template<typename _Tp>
|
||||
struct __copy_backward_dispatch<_Tp*, _Tp*, __true_type>
|
||||
{
|
||||
static _Tp*
|
||||
copy(const _Tp* __first, const _Tp* __last, _Tp* __result)
|
||||
{
|
||||
const ptrdiff_t _Num = __last - __first;
|
||||
std::memmove(__result - _Num, __first, sizeof(_Tp) * _Num);
|
||||
return __result - _Num;
|
||||
}
|
||||
};
|
||||
|
||||
template<typename _Tp>
|
||||
struct __copy_backward_dispatch<const _Tp*, _Tp*, __true_type>
|
||||
{
|
||||
static _Tp*
|
||||
copy(const _Tp* __first, const _Tp* __last, _Tp* __result)
|
||||
{
|
||||
return std::__copy_backward_dispatch<_Tp*, _Tp*, __true_type>
|
||||
::copy(__first, __last, __result);
|
||||
}
|
||||
};
|
||||
|
||||
template<typename _BI1, typename _BI2>
|
||||
inline _BI2
|
||||
__copy_backward_aux(_BI1 __first, _BI1 __last, _BI2 __result)
|
||||
{
|
||||
typedef typename __type_traits<typename iterator_traits<_BI2>::value_type>
|
||||
::has_trivial_assignment_operator _Trivial;
|
||||
return
|
||||
std::__copy_backward_dispatch<_BI1, _BI2, _Trivial>::copy(__first,
|
||||
__last,
|
||||
__result);
|
||||
}
|
||||
|
||||
template <typename _BI1, typename _BI2>
|
||||
inline _BI2
|
||||
__copy_backward_output_normal_iterator(_BI1 __first, _BI1 __last,
|
||||
_BI2 __result, __true_type)
|
||||
{ return _BI2(std::__copy_backward_aux(__first, __last, __result.base())); }
|
||||
|
||||
template <typename _BI1, typename _BI2>
|
||||
inline _BI2
|
||||
__copy_backward_output_normal_iterator(_BI1 __first, _BI1 __last,
|
||||
_BI2 __result, __false_type)
|
||||
{ return std::__copy_backward_aux(__first, __last, __result); }
|
||||
|
||||
template <typename _BI1, typename _BI2>
|
||||
inline _BI2
|
||||
__copy_backward_input_normal_iterator(_BI1 __first, _BI1 __last,
|
||||
_BI2 __result, __true_type)
|
||||
{
|
||||
typedef typename _Is_normal_iterator<_BI2>::_Normal __Normal;
|
||||
return std::__copy_backward_output_normal_iterator(__first.base(),
|
||||
__last.base(),
|
||||
__result, __Normal());
|
||||
}
|
||||
|
||||
template <typename _BI1, typename _BI2>
|
||||
inline _BI2
|
||||
__copy_backward_input_normal_iterator(_BI1 __first, _BI1 __last,
|
||||
_BI2 __result, __false_type)
|
||||
{
|
||||
typedef typename _Is_normal_iterator<_BI2>::_Normal __Normal;
|
||||
return std::__copy_backward_output_normal_iterator(__first, __last,
|
||||
__result, __Normal());
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Copies the range [first,last) into result.
|
||||
* @param first A bidirectional iterator.
|
||||
* @param last A bidirectional iterator.
|
||||
* @param result A bidirectional iterator.
|
||||
* @return result - (first - last)
|
||||
*
|
||||
* The function has the same effect as copy, but starts at the end of the
|
||||
* range and works its way to the start, returning the start of the result.
|
||||
* This inline function will boil down to a call to @c memmove whenever
|
||||
* possible. Failing that, if random access iterators are passed, then the
|
||||
* loop count will be known (and therefore a candidate for compiler
|
||||
* optimizations such as unrolling).
|
||||
*
|
||||
* Result may not be in the range [first,last). Use copy instead. Note
|
||||
* that the start of the output range may overlap [first,last).
|
||||
*/
|
||||
template <typename _BI1, typename _BI2>
|
||||
inline _BI2
|
||||
copy_backward(_BI1 __first, _BI1 __last, _BI2 __result)
|
||||
{
|
||||
// concept requirements
|
||||
__glibcxx_function_requires(_BidirectionalIteratorConcept<_BI1>)
|
||||
__glibcxx_function_requires(_Mutable_BidirectionalIteratorConcept<_BI2>)
|
||||
__glibcxx_function_requires(_ConvertibleConcept<
|
||||
typename iterator_traits<_BI1>::value_type,
|
||||
typename iterator_traits<_BI2>::value_type>)
|
||||
__glibcxx_requires_valid_range(__first, __last);
|
||||
|
||||
typedef typename _Is_normal_iterator<_BI1>::_Normal __Normal;
|
||||
return std::__copy_backward_input_normal_iterator(__first, __last,
|
||||
__result, __Normal());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Fills the range [first,last) with copies of value.
|
||||
* @param first A forward iterator.
|
||||
* @param last A forward iterator.
|
||||
* @param value A reference-to-const of arbitrary type.
|
||||
* @return Nothing.
|
||||
*
|
||||
* This function fills a range with copies of the same value. For one-byte
|
||||
* types filling contiguous areas of memory, this becomes an inline call to
|
||||
* @c memset.
|
||||
*/
|
||||
template<typename _ForwardIterator, typename _Tp>
|
||||
void
|
||||
fill(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value)
|
||||
{
|
||||
// concept requirements
|
||||
__glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
|
||||
_ForwardIterator>)
|
||||
__glibcxx_requires_valid_range(__first, __last);
|
||||
|
||||
for ( ; __first != __last; ++__first)
|
||||
*__first = __value;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Fills the range [first,first+n) with copies of value.
|
||||
* @param first An output iterator.
|
||||
* @param n The count of copies to perform.
|
||||
* @param value A reference-to-const of arbitrary type.
|
||||
* @return The iterator at first+n.
|
||||
*
|
||||
* This function fills a range with copies of the same value. For one-byte
|
||||
* types filling contiguous areas of memory, this becomes an inline call to
|
||||
* @c memset.
|
||||
*/
|
||||
template<typename _OutputIterator, typename _Size, typename _Tp>
|
||||
_OutputIterator
|
||||
fill_n(_OutputIterator __first, _Size __n, const _Tp& __value)
|
||||
{
|
||||
// concept requirements
|
||||
__glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,_Tp>)
|
||||
|
||||
for ( ; __n > 0; --__n, ++__first)
|
||||
*__first = __value;
|
||||
return __first;
|
||||
}
|
||||
|
||||
// Specialization: for one-byte types we can use memset.
|
||||
inline void
|
||||
fill(unsigned char* __first, unsigned char* __last, const unsigned char& __c)
|
||||
{
|
||||
__glibcxx_requires_valid_range(__first, __last);
|
||||
const unsigned char __tmp = __c;
|
||||
std::memset(__first, __tmp, __last - __first);
|
||||
}
|
||||
|
||||
inline void
|
||||
fill(signed char* __first, signed char* __last, const signed char& __c)
|
||||
{
|
||||
__glibcxx_requires_valid_range(__first, __last);
|
||||
const signed char __tmp = __c;
|
||||
std::memset(__first, static_cast<unsigned char>(__tmp), __last - __first);
|
||||
}
|
||||
|
||||
inline void
|
||||
fill(char* __first, char* __last, const char& __c)
|
||||
{
|
||||
__glibcxx_requires_valid_range(__first, __last);
|
||||
const char __tmp = __c;
|
||||
std::memset(__first, static_cast<unsigned char>(__tmp), __last - __first);
|
||||
}
|
||||
|
||||
template<typename _Size>
|
||||
inline unsigned char*
|
||||
fill_n(unsigned char* __first, _Size __n, const unsigned char& __c)
|
||||
{
|
||||
std::fill(__first, __first + __n, __c);
|
||||
return __first + __n;
|
||||
}
|
||||
|
||||
template<typename _Size>
|
||||
inline signed char*
|
||||
fill_n(char* __first, _Size __n, const signed char& __c)
|
||||
{
|
||||
std::fill(__first, __first + __n, __c);
|
||||
return __first + __n;
|
||||
}
|
||||
|
||||
template<typename _Size>
|
||||
inline char*
|
||||
fill_n(char* __first, _Size __n, const char& __c)
|
||||
{
|
||||
std::fill(__first, __first + __n, __c);
|
||||
return __first + __n;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Finds the places in ranges which don't match.
|
||||
* @param first1 An input iterator.
|
||||
* @param last1 An input iterator.
|
||||
* @param first2 An input iterator.
|
||||
* @return A pair of iterators pointing to the first mismatch.
|
||||
*
|
||||
* This compares the elements of two ranges using @c == and returns a pair
|
||||
* of iterators. The first iterator points into the first range, the
|
||||
* second iterator points into the second range, and the elements pointed
|
||||
* to by the iterators are not equal.
|
||||
*/
|
||||
template<typename _InputIterator1, typename _InputIterator2>
|
||||
pair<_InputIterator1, _InputIterator2>
|
||||
mismatch(_InputIterator1 __first1, _InputIterator1 __last1,
|
||||
_InputIterator2 __first2)
|
||||
{
|
||||
// concept requirements
|
||||
__glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
|
||||
__glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
|
||||
__glibcxx_function_requires(_EqualityComparableConcept<
|
||||
typename iterator_traits<_InputIterator1>::value_type>)
|
||||
__glibcxx_function_requires(_EqualityComparableConcept<
|
||||
typename iterator_traits<_InputIterator2>::value_type>)
|
||||
__glibcxx_requires_valid_range(__first1, __last1);
|
||||
|
||||
while (__first1 != __last1 && *__first1 == *__first2)
|
||||
{
|
||||
++__first1;
|
||||
++__first2;
|
||||
}
|
||||
return pair<_InputIterator1, _InputIterator2>(__first1, __first2);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Finds the places in ranges which don't match.
|
||||
* @param first1 An input iterator.
|
||||
* @param last1 An input iterator.
|
||||
* @param first2 An input iterator.
|
||||
* @param binary_pred A binary predicate @link s20_3_1_base functor@endlink.
|
||||
* @return A pair of iterators pointing to the first mismatch.
|
||||
*
|
||||
* This compares the elements of two ranges using the binary_pred
|
||||
* parameter, and returns a pair
|
||||
* of iterators. The first iterator points into the first range, the
|
||||
* second iterator points into the second range, and the elements pointed
|
||||
* to by the iterators are not equal.
|
||||
*/
|
||||
template<typename _InputIterator1, typename _InputIterator2,
|
||||
typename _BinaryPredicate>
|
||||
pair<_InputIterator1, _InputIterator2>
|
||||
mismatch(_InputIterator1 __first1, _InputIterator1 __last1,
|
||||
_InputIterator2 __first2, _BinaryPredicate __binary_pred)
|
||||
{
|
||||
// concept requirements
|
||||
__glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
|
||||
__glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
|
||||
__glibcxx_requires_valid_range(__first1, __last1);
|
||||
|
||||
while (__first1 != __last1 && __binary_pred(*__first1, *__first2))
|
||||
{
|
||||
++__first1;
|
||||
++__first2;
|
||||
}
|
||||
return pair<_InputIterator1, _InputIterator2>(__first1, __first2);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Tests a range for element-wise equality.
|
||||
* @param first1 An input iterator.
|
||||
* @param last1 An input iterator.
|
||||
* @param first2 An input iterator.
|
||||
* @return A boolean true or false.
|
||||
*
|
||||
* This compares the elements of two ranges using @c == and returns true or
|
||||
* false depending on whether all of the corresponding elements of the
|
||||
* ranges are equal.
|
||||
*/
|
||||
template<typename _InputIterator1, typename _InputIterator2>
|
||||
inline bool
|
||||
equal(_InputIterator1 __first1, _InputIterator1 __last1,
|
||||
_InputIterator2 __first2)
|
||||
{
|
||||
// concept requirements
|
||||
__glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
|
||||
__glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
|
||||
__glibcxx_function_requires(_EqualOpConcept<
|
||||
typename iterator_traits<_InputIterator1>::value_type,
|
||||
typename iterator_traits<_InputIterator2>::value_type>)
|
||||
__glibcxx_requires_valid_range(__first1, __last1);
|
||||
|
||||
for ( ; __first1 != __last1; ++__first1, ++__first2)
|
||||
if (!(*__first1 == *__first2))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Tests a range for element-wise equality.
|
||||
* @param first1 An input iterator.
|
||||
* @param last1 An input iterator.
|
||||
* @param first2 An input iterator.
|
||||
* @param binary_pred A binary predicate @link s20_3_1_base functor@endlink.
|
||||
* @return A boolean true or false.
|
||||
*
|
||||
* This compares the elements of two ranges using the binary_pred
|
||||
* parameter, and returns true or
|
||||
* false depending on whether all of the corresponding elements of the
|
||||
* ranges are equal.
|
||||
*/
|
||||
template<typename _InputIterator1, typename _InputIterator2,
|
||||
typename _BinaryPredicate>
|
||||
inline bool
|
||||
equal(_InputIterator1 __first1, _InputIterator1 __last1,
|
||||
_InputIterator2 __first2,
|
||||
_BinaryPredicate __binary_pred)
|
||||
{
|
||||
// concept requirements
|
||||
__glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
|
||||
__glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
|
||||
__glibcxx_requires_valid_range(__first1, __last1);
|
||||
|
||||
for ( ; __first1 != __last1; ++__first1, ++__first2)
|
||||
if (!__binary_pred(*__first1, *__first2))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Performs "dictionary" comparison on ranges.
|
||||
* @param first1 An input iterator.
|
||||
* @param last1 An input iterator.
|
||||
* @param first2 An input iterator.
|
||||
* @param last2 An input iterator.
|
||||
* @return A boolean true or false.
|
||||
*
|
||||
* "Returns true if the sequence of elements defined by the range
|
||||
* [first1,last1) is lexicographically less than the sequence of elements
|
||||
* defined by the range [first2,last2). Returns false otherwise."
|
||||
* (Quoted from [25.3.8]/1.) If the iterators are all character pointers,
|
||||
* then this is an inline call to @c memcmp.
|
||||
*/
|
||||
template<typename _InputIterator1, typename _InputIterator2>
|
||||
bool
|
||||
lexicographical_compare(_InputIterator1 __first1, _InputIterator1 __last1,
|
||||
_InputIterator2 __first2, _InputIterator2 __last2)
|
||||
{
|
||||
// concept requirements
|
||||
__glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
|
||||
__glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
|
||||
__glibcxx_function_requires(_LessThanComparableConcept<
|
||||
typename iterator_traits<_InputIterator1>::value_type>)
|
||||
__glibcxx_function_requires(_LessThanComparableConcept<
|
||||
typename iterator_traits<_InputIterator2>::value_type>)
|
||||
__glibcxx_requires_valid_range(__first1, __last1);
|
||||
__glibcxx_requires_valid_range(__first2, __last2);
|
||||
|
||||
for (;__first1 != __last1 && __first2 != __last2; ++__first1, ++__first2)
|
||||
{
|
||||
if (*__first1 < *__first2)
|
||||
return true;
|
||||
if (*__first2 < *__first1)
|
||||
return false;
|
||||
}
|
||||
return __first1 == __last1 && __first2 != __last2;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Performs "dictionary" comparison on ranges.
|
||||
* @param first1 An input iterator.
|
||||
* @param last1 An input iterator.
|
||||
* @param first2 An input iterator.
|
||||
* @param last2 An input iterator.
|
||||
* @param comp A @link s20_3_3_comparisons comparison functor@endlink.
|
||||
* @return A boolean true or false.
|
||||
*
|
||||
* The same as the four-parameter @c lexigraphical_compare, but uses the
|
||||
* comp parameter instead of @c <.
|
||||
*/
|
||||
template<typename _InputIterator1, typename _InputIterator2,
|
||||
typename _Compare>
|
||||
bool
|
||||
lexicographical_compare(_InputIterator1 __first1, _InputIterator1 __last1,
|
||||
_InputIterator2 __first2, _InputIterator2 __last2,
|
||||
_Compare __comp)
|
||||
{
|
||||
// concept requirements
|
||||
__glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
|
||||
__glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
|
||||
__glibcxx_requires_valid_range(__first1, __last1);
|
||||
__glibcxx_requires_valid_range(__first2, __last2);
|
||||
|
||||
for ( ; __first1 != __last1 && __first2 != __last2
|
||||
; ++__first1, ++__first2)
|
||||
{
|
||||
if (__comp(*__first1, *__first2))
|
||||
return true;
|
||||
if (__comp(*__first2, *__first1))
|
||||
return false;
|
||||
}
|
||||
return __first1 == __last1 && __first2 != __last2;
|
||||
}
|
||||
|
||||
inline bool
|
||||
lexicographical_compare(const unsigned char* __first1,
|
||||
const unsigned char* __last1,
|
||||
const unsigned char* __first2,
|
||||
const unsigned char* __last2)
|
||||
{
|
||||
__glibcxx_requires_valid_range(__first1, __last1);
|
||||
__glibcxx_requires_valid_range(__first2, __last2);
|
||||
|
||||
const size_t __len1 = __last1 - __first1;
|
||||
const size_t __len2 = __last2 - __first2;
|
||||
const int __result = std::memcmp(__first1, __first2,
|
||||
std::min(__len1, __len2));
|
||||
return __result != 0 ? __result < 0 : __len1 < __len2;
|
||||
}
|
||||
|
||||
inline bool
|
||||
lexicographical_compare(const char* __first1, const char* __last1,
|
||||
const char* __first2, const char* __last2)
|
||||
{
|
||||
__glibcxx_requires_valid_range(__first1, __last1);
|
||||
__glibcxx_requires_valid_range(__first2, __last2);
|
||||
|
||||
#if CHAR_MAX == SCHAR_MAX
|
||||
return std::lexicographical_compare((const signed char*) __first1,
|
||||
(const signed char*) __last1,
|
||||
(const signed char*) __first2,
|
||||
(const signed char*) __last2);
|
||||
#else /* CHAR_MAX == SCHAR_MAX */
|
||||
return std::lexicographical_compare((const unsigned char*) __first1,
|
||||
(const unsigned char*) __last1,
|
||||
(const unsigned char*) __first2,
|
||||
(const unsigned char*) __last2);
|
||||
#endif /* CHAR_MAX == SCHAR_MAX */
|
||||
}
|
||||
|
||||
} // namespace std
|
||||
|
||||
#endif
|
||||
@ -0,0 +1,876 @@
|
||||
// vector<bool> specialization -*- C++ -*-
|
||||
|
||||
// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 2, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING. If not, write to the Free
|
||||
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
// USA.
|
||||
|
||||
// As a special exception, you may use this file as part of a free software
|
||||
// library without restriction. Specifically, if other files instantiate
|
||||
// templates or use macros or inline functions from this file, or you compile
|
||||
// this file and link it with other files to produce an executable, this
|
||||
// file does not by itself cause the resulting executable to be covered by
|
||||
// the GNU General Public License. This exception does not however
|
||||
// invalidate any other reasons why the executable file might be covered by
|
||||
// the GNU General Public License.
|
||||
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 1994
|
||||
* Hewlett-Packard Company
|
||||
*
|
||||
* Permission to use, copy, modify, distribute and sell this software
|
||||
* and its documentation for any purpose is hereby granted without fee,
|
||||
* provided that the above copyright notice appear in all copies and
|
||||
* that both that copyright notice and this permission notice appear
|
||||
* in supporting documentation. Hewlett-Packard Company makes no
|
||||
* representations about the suitability of this software for any
|
||||
* purpose. It is provided "as is" without express or implied warranty.
|
||||
*
|
||||
*
|
||||
* Copyright (c) 1996-1999
|
||||
* Silicon Graphics Computer Systems, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, distribute and sell this software
|
||||
* and its documentation for any purpose is hereby granted without fee,
|
||||
* provided that the above copyright notice appear in all copies and
|
||||
* that both that copyright notice and this permission notice appear
|
||||
* in supporting documentation. Silicon Graphics makes no
|
||||
* representations about the suitability of this software for any
|
||||
* purpose. It is provided "as is" without express or implied warranty.
|
||||
*/
|
||||
|
||||
/** @file stl_bvector.h
|
||||
* This is an internal header file, included by other library headers.
|
||||
* You should not attempt to use it directly.
|
||||
*/
|
||||
|
||||
#ifndef _BVECTOR_H
|
||||
#define _BVECTOR_H 1
|
||||
|
||||
namespace _GLIBCXX_STD
|
||||
{
|
||||
typedef unsigned long _Bit_type;
|
||||
enum { _S_word_bit = int(CHAR_BIT * sizeof(_Bit_type)) };
|
||||
|
||||
struct _Bit_reference
|
||||
{
|
||||
_Bit_type * _M_p;
|
||||
_Bit_type _M_mask;
|
||||
|
||||
_Bit_reference(_Bit_type * __x, _Bit_type __y)
|
||||
: _M_p(__x), _M_mask(__y) { }
|
||||
|
||||
_Bit_reference() : _M_p(0), _M_mask(0) { }
|
||||
|
||||
operator bool() const { return !!(*_M_p & _M_mask); }
|
||||
|
||||
_Bit_reference&
|
||||
operator=(bool __x)
|
||||
{
|
||||
if (__x)
|
||||
*_M_p |= _M_mask;
|
||||
else
|
||||
*_M_p &= ~_M_mask;
|
||||
return *this;
|
||||
}
|
||||
|
||||
_Bit_reference&
|
||||
operator=(const _Bit_reference& __x)
|
||||
{ return *this = bool(__x); }
|
||||
|
||||
bool
|
||||
operator==(const _Bit_reference& __x) const
|
||||
{ return bool(*this) == bool(__x); }
|
||||
|
||||
bool
|
||||
operator<(const _Bit_reference& __x) const
|
||||
{ return !bool(*this) && bool(__x); }
|
||||
|
||||
void
|
||||
flip() { *_M_p ^= _M_mask; }
|
||||
};
|
||||
|
||||
struct _Bit_iterator_base : public iterator<random_access_iterator_tag, bool>
|
||||
{
|
||||
_Bit_type * _M_p;
|
||||
unsigned int _M_offset;
|
||||
|
||||
_Bit_iterator_base(_Bit_type * __x, unsigned int __y)
|
||||
: _M_p(__x), _M_offset(__y) { }
|
||||
|
||||
void
|
||||
_M_bump_up()
|
||||
{
|
||||
if (_M_offset++ == _S_word_bit - 1)
|
||||
{
|
||||
_M_offset = 0;
|
||||
++_M_p;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
_M_bump_down()
|
||||
{
|
||||
if (_M_offset-- == 0)
|
||||
{
|
||||
_M_offset = _S_word_bit - 1;
|
||||
--_M_p;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
_M_incr(ptrdiff_t __i)
|
||||
{
|
||||
difference_type __n = __i + _M_offset;
|
||||
_M_p += __n / _S_word_bit;
|
||||
__n = __n % _S_word_bit;
|
||||
if (__n < 0)
|
||||
{
|
||||
_M_offset = static_cast<unsigned int>(__n + _S_word_bit);
|
||||
--_M_p;
|
||||
}
|
||||
else
|
||||
_M_offset = static_cast<unsigned int>(__n);
|
||||
}
|
||||
|
||||
bool
|
||||
operator==(const _Bit_iterator_base& __i) const
|
||||
{ return _M_p == __i._M_p && _M_offset == __i._M_offset; }
|
||||
|
||||
bool
|
||||
operator<(const _Bit_iterator_base& __i) const
|
||||
{
|
||||
return _M_p < __i._M_p
|
||||
|| (_M_p == __i._M_p && _M_offset < __i._M_offset);
|
||||
}
|
||||
|
||||
bool
|
||||
operator!=(const _Bit_iterator_base& __i) const
|
||||
{ return !(*this == __i); }
|
||||
|
||||
bool
|
||||
operator>(const _Bit_iterator_base& __i) const
|
||||
{ return __i < *this; }
|
||||
|
||||
bool
|
||||
operator<=(const _Bit_iterator_base& __i) const
|
||||
{ return !(__i < *this); }
|
||||
|
||||
bool
|
||||
operator>=(const _Bit_iterator_base& __i) const
|
||||
{ return !(*this < __i); }
|
||||
};
|
||||
|
||||
inline ptrdiff_t
|
||||
operator-(const _Bit_iterator_base& __x, const _Bit_iterator_base& __y)
|
||||
{
|
||||
return _S_word_bit * (__x._M_p - __y._M_p) + __x._M_offset - __y._M_offset;
|
||||
}
|
||||
|
||||
struct _Bit_iterator : public _Bit_iterator_base
|
||||
{
|
||||
typedef _Bit_reference reference;
|
||||
typedef _Bit_reference* pointer;
|
||||
typedef _Bit_iterator iterator;
|
||||
|
||||
_Bit_iterator() : _Bit_iterator_base(0, 0) { }
|
||||
_Bit_iterator(_Bit_type * __x, unsigned int __y)
|
||||
: _Bit_iterator_base(__x, __y) { }
|
||||
|
||||
reference
|
||||
operator*() const { return reference(_M_p, 1UL << _M_offset); }
|
||||
|
||||
iterator&
|
||||
operator++()
|
||||
{
|
||||
_M_bump_up();
|
||||
return *this;
|
||||
}
|
||||
|
||||
iterator
|
||||
operator++(int)
|
||||
{
|
||||
iterator __tmp = *this;
|
||||
_M_bump_up();
|
||||
return __tmp;
|
||||
}
|
||||
|
||||
iterator&
|
||||
operator--()
|
||||
{
|
||||
_M_bump_down();
|
||||
return *this;
|
||||
}
|
||||
|
||||
iterator
|
||||
operator--(int)
|
||||
{
|
||||
iterator __tmp = *this;
|
||||
_M_bump_down();
|
||||
return __tmp;
|
||||
}
|
||||
|
||||
iterator&
|
||||
operator+=(difference_type __i)
|
||||
{
|
||||
_M_incr(__i);
|
||||
return *this;
|
||||
}
|
||||
|
||||
iterator&
|
||||
operator-=(difference_type __i)
|
||||
{
|
||||
*this += -__i;
|
||||
return *this;
|
||||
}
|
||||
|
||||
iterator
|
||||
operator+(difference_type __i) const
|
||||
{
|
||||
iterator __tmp = *this;
|
||||
return __tmp += __i;
|
||||
}
|
||||
|
||||
iterator
|
||||
operator-(difference_type __i) const
|
||||
{
|
||||
iterator __tmp = *this;
|
||||
return __tmp -= __i;
|
||||
}
|
||||
|
||||
reference
|
||||
operator[](difference_type __i)
|
||||
{ return *(*this + __i); }
|
||||
};
|
||||
|
||||
inline _Bit_iterator
|
||||
operator+(ptrdiff_t __n, const _Bit_iterator& __x) { return __x + __n; }
|
||||
|
||||
|
||||
struct _Bit_const_iterator : public _Bit_iterator_base
|
||||
{
|
||||
typedef bool reference;
|
||||
typedef bool const_reference;
|
||||
typedef const bool* pointer;
|
||||
typedef _Bit_const_iterator const_iterator;
|
||||
|
||||
_Bit_const_iterator() : _Bit_iterator_base(0, 0) { }
|
||||
_Bit_const_iterator(_Bit_type * __x, unsigned int __y)
|
||||
: _Bit_iterator_base(__x, __y) { }
|
||||
_Bit_const_iterator(const _Bit_iterator& __x)
|
||||
: _Bit_iterator_base(__x._M_p, __x._M_offset) { }
|
||||
|
||||
const_reference
|
||||
operator*() const
|
||||
{ return _Bit_reference(_M_p, 1UL << _M_offset); }
|
||||
|
||||
const_iterator&
|
||||
operator++()
|
||||
{
|
||||
_M_bump_up();
|
||||
return *this;
|
||||
}
|
||||
|
||||
const_iterator
|
||||
operator++(int)
|
||||
{
|
||||
const_iterator __tmp = *this;
|
||||
_M_bump_up();
|
||||
return __tmp;
|
||||
}
|
||||
|
||||
const_iterator&
|
||||
operator--()
|
||||
{
|
||||
_M_bump_down();
|
||||
return *this;
|
||||
}
|
||||
|
||||
const_iterator
|
||||
operator--(int)
|
||||
{
|
||||
const_iterator __tmp = *this;
|
||||
_M_bump_down();
|
||||
return __tmp;
|
||||
}
|
||||
|
||||
const_iterator&
|
||||
operator+=(difference_type __i)
|
||||
{
|
||||
_M_incr(__i);
|
||||
return *this;
|
||||
}
|
||||
|
||||
const_iterator&
|
||||
operator-=(difference_type __i)
|
||||
{
|
||||
*this += -__i;
|
||||
return *this;
|
||||
}
|
||||
|
||||
const_iterator
|
||||
operator+(difference_type __i) const {
|
||||
const_iterator __tmp = *this;
|
||||
return __tmp += __i;
|
||||
}
|
||||
|
||||
const_iterator
|
||||
operator-(difference_type __i) const
|
||||
{
|
||||
const_iterator __tmp = *this;
|
||||
return __tmp -= __i;
|
||||
}
|
||||
|
||||
const_reference
|
||||
operator[](difference_type __i)
|
||||
{ return *(*this + __i); }
|
||||
};
|
||||
|
||||
inline _Bit_const_iterator
|
||||
operator+(ptrdiff_t __n, const _Bit_const_iterator& __x)
|
||||
{ return __x + __n; }
|
||||
|
||||
template<class _Alloc>
|
||||
class _Bvector_base
|
||||
{
|
||||
typedef typename _Alloc::template rebind<_Bit_type>::other
|
||||
_Bit_alloc_type;
|
||||
|
||||
struct _Bvector_impl : public _Bit_alloc_type
|
||||
{
|
||||
_Bit_iterator _M_start;
|
||||
_Bit_iterator _M_finish;
|
||||
_Bit_type* _M_end_of_storage;
|
||||
_Bvector_impl(const _Bit_alloc_type& __a)
|
||||
: _Bit_alloc_type(__a), _M_start(), _M_finish(), _M_end_of_storage(0)
|
||||
{ }
|
||||
};
|
||||
|
||||
public:
|
||||
typedef _Alloc allocator_type;
|
||||
|
||||
allocator_type
|
||||
get_allocator() const
|
||||
{ return *static_cast<const _Bit_alloc_type*>(&this->_M_impl); }
|
||||
|
||||
_Bvector_base(const allocator_type& __a) : _M_impl(__a) { }
|
||||
|
||||
~_Bvector_base() { this->_M_deallocate(); }
|
||||
|
||||
protected:
|
||||
_Bvector_impl _M_impl;
|
||||
|
||||
_Bit_type*
|
||||
_M_allocate(size_t __n)
|
||||
{ return _M_impl.allocate((__n + _S_word_bit - 1) / _S_word_bit); }
|
||||
|
||||
void
|
||||
_M_deallocate()
|
||||
{
|
||||
if (_M_impl._M_start._M_p)
|
||||
_M_impl.deallocate(_M_impl._M_start._M_p,
|
||||
_M_impl._M_end_of_storage - _M_impl._M_start._M_p);
|
||||
}
|
||||
};
|
||||
} // namespace std
|
||||
|
||||
// Declare a partial specialization of vector<T, Alloc>.
|
||||
#include <bits/stl_vector.h>
|
||||
|
||||
namespace _GLIBCXX_STD
|
||||
{
|
||||
/**
|
||||
* @brief A specialization of vector for booleans which offers fixed time
|
||||
* access to individual elements in any order.
|
||||
*
|
||||
* Note that vector<bool> does not actually meet the requirements for being
|
||||
* a container. This is because the reference and pointer types are not
|
||||
* really references and pointers to bool. See DR96 for details. @see
|
||||
* vector for function documentation.
|
||||
*
|
||||
* @ingroup Containers
|
||||
* @ingroup Sequences
|
||||
*
|
||||
* In some terminology a %vector can be described as a dynamic
|
||||
* C-style array, it offers fast and efficient access to individual
|
||||
* elements in any order and saves the user from worrying about
|
||||
* memory and size allocation. Subscripting ( @c [] ) access is
|
||||
* also provided as with C-style arrays.
|
||||
*/
|
||||
template<typename _Alloc>
|
||||
class vector<bool, _Alloc> : public _Bvector_base<_Alloc>
|
||||
{
|
||||
public:
|
||||
typedef bool value_type;
|
||||
typedef size_t size_type;
|
||||
typedef ptrdiff_t difference_type;
|
||||
typedef _Bit_reference reference;
|
||||
typedef bool const_reference;
|
||||
typedef _Bit_reference* pointer;
|
||||
typedef const bool* const_pointer;
|
||||
|
||||
typedef _Bit_iterator iterator;
|
||||
typedef _Bit_const_iterator const_iterator;
|
||||
|
||||
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
|
||||
typedef std::reverse_iterator<iterator> reverse_iterator;
|
||||
|
||||
typedef typename _Bvector_base<_Alloc>::allocator_type allocator_type;
|
||||
|
||||
allocator_type get_allocator() const
|
||||
{ return _Bvector_base<_Alloc>::get_allocator(); }
|
||||
|
||||
protected:
|
||||
using _Bvector_base<_Alloc>::_M_allocate;
|
||||
using _Bvector_base<_Alloc>::_M_deallocate;
|
||||
|
||||
protected:
|
||||
void _M_initialize(size_type __n)
|
||||
{
|
||||
_Bit_type* __q = this->_M_allocate(__n);
|
||||
this->_M_impl._M_end_of_storage = __q
|
||||
+ (__n + _S_word_bit - 1) / _S_word_bit;
|
||||
this->_M_impl._M_start = iterator(__q, 0);
|
||||
this->_M_impl._M_finish = this->_M_impl._M_start + difference_type(__n);
|
||||
}
|
||||
|
||||
void _M_insert_aux(iterator __position, bool __x)
|
||||
{
|
||||
if (this->_M_impl._M_finish._M_p != this->_M_impl._M_end_of_storage)
|
||||
{
|
||||
std::copy_backward(__position, this->_M_impl._M_finish,
|
||||
this->_M_impl._M_finish + 1);
|
||||
*__position = __x;
|
||||
++this->_M_impl._M_finish;
|
||||
}
|
||||
else
|
||||
{
|
||||
const size_type __len = size() ? 2 * size()
|
||||
: static_cast<size_type>(_S_word_bit);
|
||||
_Bit_type * __q = this->_M_allocate(__len);
|
||||
iterator __i = std::copy(begin(), __position, iterator(__q, 0));
|
||||
*__i++ = __x;
|
||||
this->_M_impl._M_finish = std::copy(__position, end(), __i);
|
||||
this->_M_deallocate();
|
||||
this->_M_impl._M_end_of_storage = __q + (__len + _S_word_bit - 1)
|
||||
/ _S_word_bit;
|
||||
this->_M_impl._M_start = iterator(__q, 0);
|
||||
}
|
||||
}
|
||||
|
||||
template<class _InputIterator>
|
||||
void _M_initialize_range(_InputIterator __first, _InputIterator __last,
|
||||
input_iterator_tag)
|
||||
{
|
||||
this->_M_impl._M_start = iterator();
|
||||
this->_M_impl._M_finish = iterator();
|
||||
this->_M_impl._M_end_of_storage = 0;
|
||||
for ( ; __first != __last; ++__first)
|
||||
push_back(*__first);
|
||||
}
|
||||
|
||||
template<class _ForwardIterator>
|
||||
void _M_initialize_range(_ForwardIterator __first, _ForwardIterator __last,
|
||||
forward_iterator_tag)
|
||||
{
|
||||
const size_type __n = std::distance(__first, __last);
|
||||
_M_initialize(__n);
|
||||
std::copy(__first, __last, this->_M_impl._M_start);
|
||||
}
|
||||
|
||||
template<class _InputIterator>
|
||||
void _M_insert_range(iterator __pos, _InputIterator __first,
|
||||
_InputIterator __last, input_iterator_tag)
|
||||
{
|
||||
for ( ; __first != __last; ++__first)
|
||||
{
|
||||
__pos = insert(__pos, *__first);
|
||||
++__pos;
|
||||
}
|
||||
}
|
||||
|
||||
template<class _ForwardIterator>
|
||||
void _M_insert_range(iterator __position, _ForwardIterator __first,
|
||||
_ForwardIterator __last, forward_iterator_tag)
|
||||
{
|
||||
if (__first != __last)
|
||||
{
|
||||
size_type __n = std::distance(__first, __last);
|
||||
if (capacity() - size() >= __n)
|
||||
{
|
||||
std::copy_backward(__position, end(),
|
||||
this->_M_impl._M_finish + difference_type(__n));
|
||||
std::copy(__first, __last, __position);
|
||||
this->_M_impl._M_finish += difference_type(__n);
|
||||
}
|
||||
else
|
||||
{
|
||||
const size_type __len = size() + std::max(size(), __n);
|
||||
_Bit_type * __q = this->_M_allocate(__len);
|
||||
iterator __i = std::copy(begin(), __position, iterator(__q, 0));
|
||||
__i = std::copy(__first, __last, __i);
|
||||
this->_M_impl._M_finish = std::copy(__position, end(), __i);
|
||||
this->_M_deallocate();
|
||||
this->_M_impl._M_end_of_storage = __q + (__len + _S_word_bit - 1)
|
||||
/ _S_word_bit;
|
||||
this->_M_impl._M_start = iterator(__q, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public:
|
||||
iterator begin()
|
||||
{ return this->_M_impl._M_start; }
|
||||
|
||||
const_iterator begin() const
|
||||
{ return this->_M_impl._M_start; }
|
||||
|
||||
iterator end()
|
||||
{ return this->_M_impl._M_finish; }
|
||||
|
||||
const_iterator end() const
|
||||
{ return this->_M_impl._M_finish; }
|
||||
|
||||
reverse_iterator rbegin()
|
||||
{ return reverse_iterator(end()); }
|
||||
|
||||
const_reverse_iterator rbegin() const
|
||||
{ return const_reverse_iterator(end()); }
|
||||
|
||||
reverse_iterator rend()
|
||||
{ return reverse_iterator(begin()); }
|
||||
|
||||
const_reverse_iterator rend() const
|
||||
{ return const_reverse_iterator(begin()); }
|
||||
|
||||
size_type size() const
|
||||
{ return size_type(end() - begin()); }
|
||||
|
||||
size_type max_size() const
|
||||
{ return size_type(-1); }
|
||||
|
||||
size_type capacity() const
|
||||
{ return size_type(const_iterator(this->_M_impl._M_end_of_storage, 0)
|
||||
- begin()); }
|
||||
bool empty() const
|
||||
{ return begin() == end(); }
|
||||
|
||||
reference operator[](size_type __n)
|
||||
{ return *(begin() + difference_type(__n)); }
|
||||
|
||||
const_reference operator[](size_type __n) const
|
||||
{ return *(begin() + difference_type(__n)); }
|
||||
|
||||
void _M_range_check(size_type __n) const
|
||||
{
|
||||
if (__n >= this->size())
|
||||
__throw_out_of_range(__N("vector<bool>::_M_range_check"));
|
||||
}
|
||||
|
||||
reference at(size_type __n)
|
||||
{ _M_range_check(__n); return (*this)[__n]; }
|
||||
|
||||
const_reference at(size_type __n) const
|
||||
{ _M_range_check(__n); return (*this)[__n]; }
|
||||
|
||||
explicit vector(const allocator_type& __a = allocator_type())
|
||||
: _Bvector_base<_Alloc>(__a) { }
|
||||
|
||||
vector(size_type __n, bool __value,
|
||||
const allocator_type& __a = allocator_type())
|
||||
: _Bvector_base<_Alloc>(__a)
|
||||
{
|
||||
_M_initialize(__n);
|
||||
std::fill(this->_M_impl._M_start._M_p, this->_M_impl._M_end_of_storage,
|
||||
__value ? ~0 : 0);
|
||||
}
|
||||
|
||||
explicit vector(size_type __n)
|
||||
: _Bvector_base<_Alloc>(allocator_type())
|
||||
{
|
||||
_M_initialize(__n);
|
||||
std::fill(this->_M_impl._M_start._M_p,
|
||||
this->_M_impl._M_end_of_storage, 0);
|
||||
}
|
||||
|
||||
vector(const vector& __x) : _Bvector_base<_Alloc>(__x.get_allocator())
|
||||
{
|
||||
_M_initialize(__x.size());
|
||||
std::copy(__x.begin(), __x.end(), this->_M_impl._M_start);
|
||||
}
|
||||
|
||||
// Check whether it's an integral type. If so, it's not an iterator.
|
||||
template<class _Integer>
|
||||
void _M_initialize_dispatch(_Integer __n, _Integer __x, __true_type)
|
||||
{
|
||||
_M_initialize(__n);
|
||||
std::fill(this->_M_impl._M_start._M_p,
|
||||
this->_M_impl._M_end_of_storage, __x ? ~0 : 0);
|
||||
}
|
||||
|
||||
template<class _InputIterator>
|
||||
void
|
||||
_M_initialize_dispatch(_InputIterator __first, _InputIterator __last,
|
||||
__false_type)
|
||||
{ _M_initialize_range(__first, __last,
|
||||
std::__iterator_category(__first)); }
|
||||
|
||||
template<class _InputIterator>
|
||||
vector(_InputIterator __first, _InputIterator __last,
|
||||
const allocator_type& __a = allocator_type())
|
||||
: _Bvector_base<_Alloc>(__a)
|
||||
{
|
||||
typedef typename _Is_integer<_InputIterator>::_Integral _Integral;
|
||||
_M_initialize_dispatch(__first, __last, _Integral());
|
||||
}
|
||||
|
||||
~vector() { }
|
||||
|
||||
vector& operator=(const vector& __x)
|
||||
{
|
||||
if (&__x == this)
|
||||
return *this;
|
||||
if (__x.size() > capacity())
|
||||
{
|
||||
this->_M_deallocate();
|
||||
_M_initialize(__x.size());
|
||||
}
|
||||
std::copy(__x.begin(), __x.end(), begin());
|
||||
this->_M_impl._M_finish = begin() + difference_type(__x.size());
|
||||
return *this;
|
||||
}
|
||||
|
||||
// assign(), a generalized assignment member function. Two
|
||||
// versions: one that takes a count, and one that takes a range.
|
||||
// The range version is a member template, so we dispatch on whether
|
||||
// or not the type is an integer.
|
||||
|
||||
void _M_fill_assign(size_t __n, bool __x)
|
||||
{
|
||||
if (__n > size())
|
||||
{
|
||||
std::fill(this->_M_impl._M_start._M_p,
|
||||
this->_M_impl._M_end_of_storage, __x ? ~0 : 0);
|
||||
insert(end(), __n - size(), __x);
|
||||
}
|
||||
else
|
||||
{
|
||||
erase(begin() + __n, end());
|
||||
std::fill(this->_M_impl._M_start._M_p,
|
||||
this->_M_impl._M_end_of_storage, __x ? ~0 : 0);
|
||||
}
|
||||
}
|
||||
|
||||
void assign(size_t __n, bool __x)
|
||||
{ _M_fill_assign(__n, __x); }
|
||||
|
||||
template<class _InputIterator>
|
||||
void assign(_InputIterator __first, _InputIterator __last)
|
||||
{
|
||||
typedef typename _Is_integer<_InputIterator>::_Integral _Integral;
|
||||
_M_assign_dispatch(__first, __last, _Integral());
|
||||
}
|
||||
|
||||
template<class _Integer>
|
||||
void _M_assign_dispatch(_Integer __n, _Integer __val, __true_type)
|
||||
{ _M_fill_assign((size_t) __n, (bool) __val); }
|
||||
|
||||
template<class _InputIterator>
|
||||
void _M_assign_dispatch(_InputIterator __first, _InputIterator __last,
|
||||
__false_type)
|
||||
{ _M_assign_aux(__first, __last, std::__iterator_category(__first)); }
|
||||
|
||||
template<class _InputIterator>
|
||||
void _M_assign_aux(_InputIterator __first, _InputIterator __last,
|
||||
input_iterator_tag)
|
||||
{
|
||||
iterator __cur = begin();
|
||||
for ( ; __first != __last && __cur != end(); ++__cur, ++__first)
|
||||
*__cur = *__first;
|
||||
if (__first == __last)
|
||||
erase(__cur, end());
|
||||
else
|
||||
insert(end(), __first, __last);
|
||||
}
|
||||
|
||||
template<class _ForwardIterator>
|
||||
void _M_assign_aux(_ForwardIterator __first, _ForwardIterator __last,
|
||||
forward_iterator_tag)
|
||||
{
|
||||
const size_type __len = std::distance(__first, __last);
|
||||
if (__len < size())
|
||||
erase(std::copy(__first, __last, begin()), end());
|
||||
else
|
||||
{
|
||||
_ForwardIterator __mid = __first;
|
||||
std::advance(__mid, size());
|
||||
std::copy(__first, __mid, begin());
|
||||
insert(end(), __mid, __last);
|
||||
}
|
||||
}
|
||||
|
||||
void reserve(size_type __n)
|
||||
{
|
||||
if (__n > this->max_size())
|
||||
__throw_length_error(__N("vector::reserve"));
|
||||
if (this->capacity() < __n)
|
||||
{
|
||||
_Bit_type* __q = this->_M_allocate(__n);
|
||||
this->_M_impl._M_finish = std::copy(begin(), end(),
|
||||
iterator(__q, 0));
|
||||
this->_M_deallocate();
|
||||
this->_M_impl._M_start = iterator(__q, 0);
|
||||
this->_M_impl._M_end_of_storage = __q + (__n + _S_word_bit - 1) / _S_word_bit;
|
||||
}
|
||||
}
|
||||
|
||||
reference front()
|
||||
{ return *begin(); }
|
||||
|
||||
const_reference front() const
|
||||
{ return *begin(); }
|
||||
|
||||
reference back()
|
||||
{ return *(end() - 1); }
|
||||
|
||||
const_reference back() const
|
||||
{ return *(end() - 1); }
|
||||
|
||||
void push_back(bool __x)
|
||||
{
|
||||
if (this->_M_impl._M_finish._M_p != this->_M_impl._M_end_of_storage)
|
||||
*this->_M_impl._M_finish++ = __x;
|
||||
else
|
||||
_M_insert_aux(end(), __x);
|
||||
}
|
||||
|
||||
void swap(vector<bool, _Alloc>& __x)
|
||||
{
|
||||
std::swap(this->_M_impl._M_start, __x._M_impl._M_start);
|
||||
std::swap(this->_M_impl._M_finish, __x._M_impl._M_finish);
|
||||
std::swap(this->_M_impl._M_end_of_storage,
|
||||
__x._M_impl._M_end_of_storage);
|
||||
}
|
||||
|
||||
// [23.2.5]/1, third-to-last entry in synopsis listing
|
||||
static void swap(reference __x, reference __y)
|
||||
{
|
||||
bool __tmp = __x;
|
||||
__x = __y;
|
||||
__y = __tmp;
|
||||
}
|
||||
|
||||
iterator insert(iterator __position, bool __x = bool())
|
||||
{
|
||||
const difference_type __n = __position - begin();
|
||||
if (this->_M_impl._M_finish._M_p != this->_M_impl._M_end_of_storage
|
||||
&& __position == end())
|
||||
*this->_M_impl._M_finish++ = __x;
|
||||
else
|
||||
_M_insert_aux(__position, __x);
|
||||
return begin() + __n;
|
||||
}
|
||||
|
||||
// Check whether it's an integral type. If so, it's not an iterator.
|
||||
|
||||
template<class _Integer>
|
||||
void _M_insert_dispatch(iterator __pos, _Integer __n, _Integer __x,
|
||||
__true_type)
|
||||
{ _M_fill_insert(__pos, __n, __x); }
|
||||
|
||||
template<class _InputIterator>
|
||||
void _M_insert_dispatch(iterator __pos,
|
||||
_InputIterator __first, _InputIterator __last,
|
||||
__false_type)
|
||||
{ _M_insert_range(__pos, __first, __last,
|
||||
std::__iterator_category(__first)); }
|
||||
|
||||
template<class _InputIterator>
|
||||
void insert(iterator __position,
|
||||
_InputIterator __first, _InputIterator __last)
|
||||
{
|
||||
typedef typename _Is_integer<_InputIterator>::_Integral _Integral;
|
||||
_M_insert_dispatch(__position, __first, __last, _Integral());
|
||||
}
|
||||
|
||||
void _M_fill_insert(iterator __position, size_type __n, bool __x)
|
||||
{
|
||||
if (__n == 0)
|
||||
return;
|
||||
if (capacity() - size() >= __n)
|
||||
{
|
||||
std::copy_backward(__position, end(),
|
||||
this->_M_impl._M_finish + difference_type(__n));
|
||||
std::fill(__position, __position + difference_type(__n), __x);
|
||||
this->_M_impl._M_finish += difference_type(__n);
|
||||
}
|
||||
else
|
||||
{
|
||||
const size_type __len = size() + std::max(size(), __n);
|
||||
_Bit_type * __q = this->_M_allocate(__len);
|
||||
iterator __i = std::copy(begin(), __position, iterator(__q, 0));
|
||||
std::fill_n(__i, __n, __x);
|
||||
this->_M_impl._M_finish = std::copy(__position, end(),
|
||||
__i + difference_type(__n));
|
||||
this->_M_deallocate();
|
||||
this->_M_impl._M_end_of_storage = __q + (__len + _S_word_bit - 1)
|
||||
/ _S_word_bit;
|
||||
this->_M_impl._M_start = iterator(__q, 0);
|
||||
}
|
||||
}
|
||||
|
||||
void insert(iterator __position, size_type __n, bool __x)
|
||||
{ _M_fill_insert(__position, __n, __x); }
|
||||
|
||||
void pop_back()
|
||||
{ --this->_M_impl._M_finish; }
|
||||
|
||||
iterator erase(iterator __position)
|
||||
{
|
||||
if (__position + 1 != end())
|
||||
std::copy(__position + 1, end(), __position);
|
||||
--this->_M_impl._M_finish;
|
||||
return __position;
|
||||
}
|
||||
|
||||
iterator erase(iterator __first, iterator __last)
|
||||
{
|
||||
this->_M_impl._M_finish = std::copy(__last, end(), __first);
|
||||
return __first;
|
||||
}
|
||||
|
||||
void resize(size_type __new_size, bool __x = bool())
|
||||
{
|
||||
if (__new_size < size())
|
||||
erase(begin() + difference_type(__new_size), end());
|
||||
else
|
||||
insert(end(), __new_size - size(), __x);
|
||||
}
|
||||
|
||||
void flip()
|
||||
{
|
||||
for (_Bit_type * __p = this->_M_impl._M_start._M_p;
|
||||
__p != this->_M_impl._M_end_of_storage; ++__p)
|
||||
*__p = ~*__p;
|
||||
}
|
||||
|
||||
void clear()
|
||||
{ erase(begin(), end()); }
|
||||
};
|
||||
} // namespace std
|
||||
|
||||
#endif
|
||||
@ -0,0 +1,157 @@
|
||||
// nonstandard construct and destroy functions -*- C++ -*-
|
||||
|
||||
// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 2, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING. If not, write to the Free
|
||||
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
// USA.
|
||||
|
||||
// As a special exception, you may use this file as part of a free software
|
||||
// library without restriction. Specifically, if other files instantiate
|
||||
// templates or use macros or inline functions from this file, or you compile
|
||||
// this file and link it with other files to produce an executable, this
|
||||
// file does not by itself cause the resulting executable to be covered by
|
||||
// the GNU General Public License. This exception does not however
|
||||
// invalidate any other reasons why the executable file might be covered by
|
||||
// the GNU General Public License.
|
||||
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 1994
|
||||
* Hewlett-Packard Company
|
||||
*
|
||||
* Permission to use, copy, modify, distribute and sell this software
|
||||
* and its documentation for any purpose is hereby granted without fee,
|
||||
* provided that the above copyright notice appear in all copies and
|
||||
* that both that copyright notice and this permission notice appear
|
||||
* in supporting documentation. Hewlett-Packard Company makes no
|
||||
* representations about the suitability of this software for any
|
||||
* purpose. It is provided "as is" without express or implied warranty.
|
||||
*
|
||||
*
|
||||
* Copyright (c) 1996,1997
|
||||
* Silicon Graphics Computer Systems, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, distribute and sell this software
|
||||
* and its documentation for any purpose is hereby granted without fee,
|
||||
* provided that the above copyright notice appear in all copies and
|
||||
* that both that copyright notice and this permission notice appear
|
||||
* in supporting documentation. Silicon Graphics makes no
|
||||
* representations about the suitability of this software for any
|
||||
* purpose. It is provided "as is" without express or implied warranty.
|
||||
*/
|
||||
|
||||
/** @file stl_construct.h
|
||||
* This is an internal header file, included by other library headers.
|
||||
* You should not attempt to use it directly.
|
||||
*/
|
||||
|
||||
#ifndef _STL_CONSTRUCT_H
|
||||
#define _STL_CONSTRUCT_H 1
|
||||
|
||||
#include <bits/type_traits.h>
|
||||
#include <new>
|
||||
|
||||
namespace std
|
||||
{
|
||||
/**
|
||||
* @if maint
|
||||
* Constructs an object in existing memory by invoking an allocated
|
||||
* object's constructor with an initializer.
|
||||
* @endif
|
||||
*/
|
||||
template<typename _T1, typename _T2>
|
||||
inline void
|
||||
_Construct(_T1* __p, const _T2& __value)
|
||||
{
|
||||
// _GLIBCXX_RESOLVE_LIB_DEFECTS
|
||||
// 402. wrong new expression in [some_]allocator::construct
|
||||
::new(static_cast<void*>(__p)) _T1(__value);
|
||||
}
|
||||
|
||||
/**
|
||||
* @if maint
|
||||
* Constructs an object in existing memory by invoking an allocated
|
||||
* object's default constructor (no initializers).
|
||||
* @endif
|
||||
*/
|
||||
template<typename _T1>
|
||||
inline void
|
||||
_Construct(_T1* __p)
|
||||
{
|
||||
// _GLIBCXX_RESOLVE_LIB_DEFECTS
|
||||
// 402. wrong new expression in [some_]allocator::construct
|
||||
::new(static_cast<void*>(__p)) _T1();
|
||||
}
|
||||
|
||||
/**
|
||||
* @if maint
|
||||
* Destroy the object pointed to by a pointer type.
|
||||
* @endif
|
||||
*/
|
||||
template<typename _Tp>
|
||||
inline void
|
||||
_Destroy(_Tp* __pointer)
|
||||
{ __pointer->~_Tp(); }
|
||||
|
||||
/**
|
||||
* @if maint
|
||||
* Destroy a range of objects with nontrivial destructors.
|
||||
*
|
||||
* This is a helper function used only by _Destroy().
|
||||
* @endif
|
||||
*/
|
||||
template<typename _ForwardIterator>
|
||||
inline void
|
||||
__destroy_aux(_ForwardIterator __first, _ForwardIterator __last,
|
||||
__false_type)
|
||||
{ for ( ; __first != __last; ++__first) std::_Destroy(&*__first); }
|
||||
|
||||
/**
|
||||
* @if maint
|
||||
* Destroy a range of objects with trivial destructors. Since the destructors
|
||||
* are trivial, there's nothing to do and hopefully this function will be
|
||||
* entirely optimized away.
|
||||
*
|
||||
* This is a helper function used only by _Destroy().
|
||||
* @endif
|
||||
*/
|
||||
template<typename _ForwardIterator>
|
||||
inline void
|
||||
__destroy_aux(_ForwardIterator, _ForwardIterator, __true_type)
|
||||
{ }
|
||||
|
||||
/**
|
||||
* @if maint
|
||||
* Destroy a range of objects. If the value_type of the object has
|
||||
* a trivial destructor, the compiler should optimize all of this
|
||||
* away, otherwise the objects' destructors must be invoked.
|
||||
* @endif
|
||||
*/
|
||||
template<typename _ForwardIterator>
|
||||
inline void
|
||||
_Destroy(_ForwardIterator __first, _ForwardIterator __last)
|
||||
{
|
||||
typedef typename iterator_traits<_ForwardIterator>::value_type
|
||||
_Value_type;
|
||||
typedef typename __type_traits<_Value_type>::has_trivial_destructor
|
||||
_Has_trivial_destructor;
|
||||
|
||||
std::__destroy_aux(__first, __last, _Has_trivial_destructor());
|
||||
}
|
||||
} // namespace std
|
||||
|
||||
#endif /* _STL_CONSTRUCT_H */
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,898 @@
|
||||
// Functor implementations -*- C++ -*-
|
||||
|
||||
// Copyright (C) 2001, 2002, 2004 Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 2, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING. If not, write to the Free
|
||||
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
// USA.
|
||||
|
||||
// As a special exception, you may use this file as part of a free software
|
||||
// library without restriction. Specifically, if other files instantiate
|
||||
// templates or use macros or inline functions from this file, or you compile
|
||||
// this file and link it with other files to produce an executable, this
|
||||
// file does not by itself cause the resulting executable to be covered by
|
||||
// the GNU General Public License. This exception does not however
|
||||
// invalidate any other reasons why the executable file might be covered by
|
||||
// the GNU General Public License.
|
||||
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 1994
|
||||
* Hewlett-Packard Company
|
||||
*
|
||||
* Permission to use, copy, modify, distribute and sell this software
|
||||
* and its documentation for any purpose is hereby granted without fee,
|
||||
* provided that the above copyright notice appear in all copies and
|
||||
* that both that copyright notice and this permission notice appear
|
||||
* in supporting documentation. Hewlett-Packard Company makes no
|
||||
* representations about the suitability of this software for any
|
||||
* purpose. It is provided "as is" without express or implied warranty.
|
||||
*
|
||||
*
|
||||
* Copyright (c) 1996-1998
|
||||
* Silicon Graphics Computer Systems, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, distribute and sell this software
|
||||
* and its documentation for any purpose is hereby granted without fee,
|
||||
* provided that the above copyright notice appear in all copies and
|
||||
* that both that copyright notice and this permission notice appear
|
||||
* in supporting documentation. Silicon Graphics makes no
|
||||
* representations about the suitability of this software for any
|
||||
* purpose. It is provided "as is" without express or implied warranty.
|
||||
*/
|
||||
|
||||
/** @file stl_function.h
|
||||
* This is an internal header file, included by other library headers.
|
||||
* You should not attempt to use it directly.
|
||||
*/
|
||||
|
||||
#ifndef _FUNCTION_H
|
||||
#define _FUNCTION_H 1
|
||||
|
||||
namespace std
|
||||
{
|
||||
// 20.3.1 base classes
|
||||
/** @defgroup s20_3_1_base Functor Base Classes
|
||||
* Function objects, or @e functors, are objects with an @c operator()
|
||||
* defined and accessible. They can be passed as arguments to algorithm
|
||||
* templates and used in place of a function pointer. Not only is the
|
||||
* resulting expressiveness of the library increased, but the generated
|
||||
* code can be more efficient than what you might write by hand. When we
|
||||
* refer to "functors," then, generally we include function pointers in
|
||||
* the description as well.
|
||||
*
|
||||
* Often, functors are only created as temporaries passed to algorithm
|
||||
* calls, rather than being created as named variables.
|
||||
*
|
||||
* Two examples taken from the standard itself follow. To perform a
|
||||
* by-element addition of two vectors @c a and @c b containing @c double,
|
||||
* and put the result in @c a, use
|
||||
* \code
|
||||
* transform (a.begin(), a.end(), b.begin(), a.begin(), plus<double>());
|
||||
* \endcode
|
||||
* To negate every element in @c a, use
|
||||
* \code
|
||||
* transform(a.begin(), a.end(), a.begin(), negate<double>());
|
||||
* \endcode
|
||||
* The addition and negation functions will be inlined directly.
|
||||
*
|
||||
* The standard functiors are derived from structs named @c unary_function
|
||||
* and @c binary_function. These two classes contain nothing but typedefs,
|
||||
* to aid in generic (template) programming. If you write your own
|
||||
* functors, you might consider doing the same.
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
/**
|
||||
* This is one of the @link s20_3_1_base functor base classes@endlink.
|
||||
*/
|
||||
template <class _Arg, class _Result>
|
||||
struct unary_function
|
||||
{
|
||||
typedef _Arg argument_type; ///< @c argument_type is the type of the
|
||||
/// argument (no surprises here)
|
||||
|
||||
typedef _Result result_type; ///< @c result_type is the return type
|
||||
};
|
||||
|
||||
/**
|
||||
* This is one of the @link s20_3_1_base functor base classes@endlink.
|
||||
*/
|
||||
template <class _Arg1, class _Arg2, class _Result>
|
||||
struct binary_function
|
||||
{
|
||||
typedef _Arg1 first_argument_type; ///< the type of the first argument
|
||||
/// (no surprises here)
|
||||
|
||||
typedef _Arg2 second_argument_type; ///< the type of the second argument
|
||||
typedef _Result result_type; ///< type of the return type
|
||||
};
|
||||
/** @} */
|
||||
|
||||
// 20.3.2 arithmetic
|
||||
/** @defgroup s20_3_2_arithmetic Arithmetic Classes
|
||||
* Because basic math often needs to be done during an algorithm, the library
|
||||
* provides functors for those operations. See the documentation for
|
||||
* @link s20_3_1_base the base classes@endlink for examples of their use.
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
/// One of the @link s20_3_2_arithmetic math functors@endlink.
|
||||
template <class _Tp>
|
||||
struct plus : public binary_function<_Tp, _Tp, _Tp>
|
||||
{
|
||||
_Tp
|
||||
operator()(const _Tp& __x, const _Tp& __y) const
|
||||
{ return __x + __y; }
|
||||
};
|
||||
|
||||
/// One of the @link s20_3_2_arithmetic math functors@endlink.
|
||||
template <class _Tp>
|
||||
struct minus : public binary_function<_Tp, _Tp, _Tp>
|
||||
{
|
||||
_Tp
|
||||
operator()(const _Tp& __x, const _Tp& __y) const
|
||||
{ return __x - __y; }
|
||||
};
|
||||
|
||||
/// One of the @link s20_3_2_arithmetic math functors@endlink.
|
||||
template <class _Tp>
|
||||
struct multiplies : public binary_function<_Tp, _Tp, _Tp>
|
||||
{
|
||||
_Tp
|
||||
operator()(const _Tp& __x, const _Tp& __y) const
|
||||
{ return __x * __y; }
|
||||
};
|
||||
|
||||
/// One of the @link s20_3_2_arithmetic math functors@endlink.
|
||||
template <class _Tp>
|
||||
struct divides : public binary_function<_Tp, _Tp, _Tp>
|
||||
{
|
||||
_Tp
|
||||
operator()(const _Tp& __x, const _Tp& __y) const
|
||||
{ return __x / __y; }
|
||||
};
|
||||
|
||||
/// One of the @link s20_3_2_arithmetic math functors@endlink.
|
||||
template <class _Tp>
|
||||
struct modulus : public binary_function<_Tp, _Tp, _Tp>
|
||||
{
|
||||
_Tp
|
||||
operator()(const _Tp& __x, const _Tp& __y) const
|
||||
{ return __x % __y; }
|
||||
};
|
||||
|
||||
/// One of the @link s20_3_2_arithmetic math functors@endlink.
|
||||
template <class _Tp>
|
||||
struct negate : public unary_function<_Tp, _Tp>
|
||||
{
|
||||
_Tp
|
||||
operator()(const _Tp& __x) const
|
||||
{ return -__x; }
|
||||
};
|
||||
/** @} */
|
||||
|
||||
// 20.3.3 comparisons
|
||||
/** @defgroup s20_3_3_comparisons Comparison Classes
|
||||
* The library provides six wrapper functors for all the basic comparisons
|
||||
* in C++, like @c <.
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
/// One of the @link s20_3_3_comparisons comparison functors@endlink.
|
||||
template <class _Tp>
|
||||
struct equal_to : public binary_function<_Tp, _Tp, bool>
|
||||
{
|
||||
bool
|
||||
operator()(const _Tp& __x, const _Tp& __y) const
|
||||
{ return __x == __y; }
|
||||
};
|
||||
|
||||
/// One of the @link s20_3_3_comparisons comparison functors@endlink.
|
||||
template <class _Tp>
|
||||
struct not_equal_to : public binary_function<_Tp, _Tp, bool>
|
||||
{
|
||||
bool
|
||||
operator()(const _Tp& __x, const _Tp& __y) const
|
||||
{ return __x != __y; }
|
||||
};
|
||||
|
||||
/// One of the @link s20_3_3_comparisons comparison functors@endlink.
|
||||
template <class _Tp>
|
||||
struct greater : public binary_function<_Tp, _Tp, bool>
|
||||
{
|
||||
bool
|
||||
operator()(const _Tp& __x, const _Tp& __y) const
|
||||
{ return __x > __y; }
|
||||
};
|
||||
|
||||
/// One of the @link s20_3_3_comparisons comparison functors@endlink.
|
||||
template <class _Tp>
|
||||
struct less : public binary_function<_Tp, _Tp, bool>
|
||||
{
|
||||
bool
|
||||
operator()(const _Tp& __x, const _Tp& __y) const
|
||||
{ return __x < __y; }
|
||||
};
|
||||
|
||||
/// One of the @link s20_3_3_comparisons comparison functors@endlink.
|
||||
template <class _Tp>
|
||||
struct greater_equal : public binary_function<_Tp, _Tp, bool>
|
||||
{
|
||||
bool
|
||||
operator()(const _Tp& __x, const _Tp& __y) const
|
||||
{ return __x >= __y; }
|
||||
};
|
||||
|
||||
/// One of the @link s20_3_3_comparisons comparison functors@endlink.
|
||||
template <class _Tp>
|
||||
struct less_equal : public binary_function<_Tp, _Tp, bool>
|
||||
{
|
||||
bool
|
||||
operator()(const _Tp& __x, const _Tp& __y) const
|
||||
{ return __x <= __y; }
|
||||
};
|
||||
/** @} */
|
||||
|
||||
// 20.3.4 logical operations
|
||||
/** @defgroup s20_3_4_logical Boolean Operations Classes
|
||||
* Here are wrapper functors for Boolean operations: @c &&, @c ||, and @c !.
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
/// One of the @link s20_3_4_logical Boolean operations functors@endlink.
|
||||
template <class _Tp>
|
||||
struct logical_and : public binary_function<_Tp, _Tp, bool>
|
||||
{
|
||||
bool
|
||||
operator()(const _Tp& __x, const _Tp& __y) const
|
||||
{ return __x && __y; }
|
||||
};
|
||||
|
||||
/// One of the @link s20_3_4_logical Boolean operations functors@endlink.
|
||||
template <class _Tp>
|
||||
struct logical_or : public binary_function<_Tp, _Tp, bool>
|
||||
{
|
||||
bool
|
||||
operator()(const _Tp& __x, const _Tp& __y) const
|
||||
{ return __x || __y; }
|
||||
};
|
||||
|
||||
/// One of the @link s20_3_4_logical Boolean operations functors@endlink.
|
||||
template <class _Tp>
|
||||
struct logical_not : public unary_function<_Tp, bool>
|
||||
{
|
||||
bool
|
||||
operator()(const _Tp& __x) const
|
||||
{ return !__x; }
|
||||
};
|
||||
/** @} */
|
||||
|
||||
// 20.3.5 negators
|
||||
/** @defgroup s20_3_5_negators Negators
|
||||
* The functions @c not1 and @c not2 each take a predicate functor
|
||||
* and return an instance of @c unary_negate or
|
||||
* @c binary_negate, respectively. These classes are functors whose
|
||||
* @c operator() performs the stored predicate function and then returns
|
||||
* the negation of the result.
|
||||
*
|
||||
* For example, given a vector of integers and a trivial predicate,
|
||||
* \code
|
||||
* struct IntGreaterThanThree
|
||||
* : public std::unary_function<int, bool>
|
||||
* {
|
||||
* bool operator() (int x) { return x > 3; }
|
||||
* };
|
||||
*
|
||||
* std::find_if (v.begin(), v.end(), not1(IntGreaterThanThree()));
|
||||
* \endcode
|
||||
* The call to @c find_if will locate the first index (i) of @c v for which
|
||||
* "!(v[i] > 3)" is true.
|
||||
*
|
||||
* The not1/unary_negate combination works on predicates taking a single
|
||||
* argument. The not2/binary_negate combination works on predicates which
|
||||
* take two arguments.
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
/// One of the @link s20_3_5_negators negation functors@endlink.
|
||||
template <class _Predicate>
|
||||
class unary_negate
|
||||
: public unary_function<typename _Predicate::argument_type, bool>
|
||||
{
|
||||
protected:
|
||||
_Predicate _M_pred;
|
||||
public:
|
||||
explicit
|
||||
unary_negate(const _Predicate& __x) : _M_pred(__x) {}
|
||||
|
||||
bool
|
||||
operator()(const typename _Predicate::argument_type& __x) const
|
||||
{ return !_M_pred(__x); }
|
||||
};
|
||||
|
||||
/// One of the @link s20_3_5_negators negation functors@endlink.
|
||||
template <class _Predicate>
|
||||
inline unary_negate<_Predicate>
|
||||
not1(const _Predicate& __pred)
|
||||
{ return unary_negate<_Predicate>(__pred); }
|
||||
|
||||
/// One of the @link s20_3_5_negators negation functors@endlink.
|
||||
template <class _Predicate>
|
||||
class binary_negate
|
||||
: public binary_function<typename _Predicate::first_argument_type,
|
||||
typename _Predicate::second_argument_type,
|
||||
bool>
|
||||
{
|
||||
protected:
|
||||
_Predicate _M_pred;
|
||||
public:
|
||||
explicit
|
||||
binary_negate(const _Predicate& __x)
|
||||
: _M_pred(__x) { }
|
||||
|
||||
bool
|
||||
operator()(const typename _Predicate::first_argument_type& __x,
|
||||
const typename _Predicate::second_argument_type& __y) const
|
||||
{ return !_M_pred(__x, __y); }
|
||||
};
|
||||
|
||||
/// One of the @link s20_3_5_negators negation functors@endlink.
|
||||
template <class _Predicate>
|
||||
inline binary_negate<_Predicate>
|
||||
not2(const _Predicate& __pred)
|
||||
{ return binary_negate<_Predicate>(__pred); }
|
||||
/** @} */
|
||||
|
||||
// 20.3.6 binders
|
||||
/** @defgroup s20_3_6_binder Binder Classes
|
||||
* Binders turn functions/functors with two arguments into functors with
|
||||
* a single argument, storing an argument to be applied later. For
|
||||
* example, an variable @c B of type @c binder1st is constructed from a
|
||||
* functor @c f and an argument @c x. Later, B's @c operator() is called
|
||||
* with a single argument @c y. The return value is the value of @c f(x,y).
|
||||
* @c B can be "called" with various arguments (y1, y2, ...) and will in
|
||||
* turn call @c f(x,y1), @c f(x,y2), ...
|
||||
*
|
||||
* The function @c bind1st is provided to save some typing. It takes the
|
||||
* function and an argument as parameters, and returns an instance of
|
||||
* @c binder1st.
|
||||
*
|
||||
* The type @c binder2nd and its creator function @c bind2nd do the same
|
||||
* thing, but the stored argument is passed as the second parameter instead
|
||||
* of the first, e.g., @c bind2nd(std::minus<float>,1.3) will create a
|
||||
* functor whose @c operator() accepts a floating-point number, subtracts
|
||||
* 1.3 from it, and returns the result. (If @c bind1st had been used,
|
||||
* the functor would perform "1.3 - x" instead.
|
||||
*
|
||||
* Creator-wrapper functions like @c bind1st are intended to be used in
|
||||
* calling algorithms. Their return values will be temporary objects.
|
||||
* (The goal is to not require you to type names like
|
||||
* @c std::binder1st<std::plus<int>> for declaring a variable to hold the
|
||||
* return value from @c bind1st(std::plus<int>,5).
|
||||
*
|
||||
* These become more useful when combined with the composition functions.
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
/// One of the @link s20_3_6_binder binder functors@endlink.
|
||||
template <class _Operation>
|
||||
class binder1st
|
||||
: public unary_function<typename _Operation::second_argument_type,
|
||||
typename _Operation::result_type>
|
||||
{
|
||||
protected:
|
||||
_Operation op;
|
||||
typename _Operation::first_argument_type value;
|
||||
public:
|
||||
binder1st(const _Operation& __x,
|
||||
const typename _Operation::first_argument_type& __y)
|
||||
: op(__x), value(__y) {}
|
||||
|
||||
typename _Operation::result_type
|
||||
operator()(const typename _Operation::second_argument_type& __x) const
|
||||
{ return op(value, __x); }
|
||||
|
||||
// _GLIBCXX_RESOLVE_LIB_DEFECTS
|
||||
// 109. Missing binders for non-const sequence elements
|
||||
typename _Operation::result_type
|
||||
operator()(typename _Operation::second_argument_type& __x) const
|
||||
{ return op(value, __x); }
|
||||
};
|
||||
|
||||
/// One of the @link s20_3_6_binder binder functors@endlink.
|
||||
template <class _Operation, class _Tp>
|
||||
inline binder1st<_Operation>
|
||||
bind1st(const _Operation& __fn, const _Tp& __x)
|
||||
{
|
||||
typedef typename _Operation::first_argument_type _Arg1_type;
|
||||
return binder1st<_Operation>(__fn, _Arg1_type(__x));
|
||||
}
|
||||
|
||||
/// One of the @link s20_3_6_binder binder functors@endlink.
|
||||
template <class _Operation>
|
||||
class binder2nd
|
||||
: public unary_function<typename _Operation::first_argument_type,
|
||||
typename _Operation::result_type>
|
||||
{
|
||||
protected:
|
||||
_Operation op;
|
||||
typename _Operation::second_argument_type value;
|
||||
public:
|
||||
binder2nd(const _Operation& __x,
|
||||
const typename _Operation::second_argument_type& __y)
|
||||
: op(__x), value(__y) {}
|
||||
|
||||
typename _Operation::result_type
|
||||
operator()(const typename _Operation::first_argument_type& __x) const
|
||||
{ return op(__x, value); }
|
||||
|
||||
// _GLIBCXX_RESOLVE_LIB_DEFECTS
|
||||
// 109. Missing binders for non-const sequence elements
|
||||
typename _Operation::result_type
|
||||
operator()(typename _Operation::first_argument_type& __x) const
|
||||
{ return op(__x, value); }
|
||||
};
|
||||
|
||||
/// One of the @link s20_3_6_binder binder functors@endlink.
|
||||
template <class _Operation, class _Tp>
|
||||
inline binder2nd<_Operation>
|
||||
bind2nd(const _Operation& __fn, const _Tp& __x)
|
||||
{
|
||||
typedef typename _Operation::second_argument_type _Arg2_type;
|
||||
return binder2nd<_Operation>(__fn, _Arg2_type(__x));
|
||||
}
|
||||
/** @} */
|
||||
|
||||
// 20.3.7 adaptors pointers functions
|
||||
/** @defgroup s20_3_7_adaptors Adaptors for pointers to functions
|
||||
* The advantage of function objects over pointers to functions is that
|
||||
* the objects in the standard library declare nested typedefs describing
|
||||
* their argument and result types with uniform names (e.g., @c result_type
|
||||
* from the base classes @c unary_function and @c binary_function).
|
||||
* Sometimes those typedefs are required, not just optional.
|
||||
*
|
||||
* Adaptors are provided to turn pointers to unary (single-argument) and
|
||||
* binary (double-argument) functions into function objects. The
|
||||
* long-winded functor @c pointer_to_unary_function is constructed with a
|
||||
* function pointer @c f, and its @c operator() called with argument @c x
|
||||
* returns @c f(x). The functor @c pointer_to_binary_function does the same
|
||||
* thing, but with a double-argument @c f and @c operator().
|
||||
*
|
||||
* The function @c ptr_fun takes a pointer-to-function @c f and constructs
|
||||
* an instance of the appropriate functor.
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
/// One of the @link s20_3_7_adaptors adaptors for function pointers@endlink.
|
||||
template <class _Arg, class _Result>
|
||||
class pointer_to_unary_function : public unary_function<_Arg, _Result>
|
||||
{
|
||||
protected:
|
||||
_Result (*_M_ptr)(_Arg);
|
||||
public:
|
||||
pointer_to_unary_function() {}
|
||||
|
||||
explicit
|
||||
pointer_to_unary_function(_Result (*__x)(_Arg))
|
||||
: _M_ptr(__x) {}
|
||||
|
||||
_Result
|
||||
operator()(_Arg __x) const
|
||||
{ return _M_ptr(__x); }
|
||||
};
|
||||
|
||||
/// One of the @link s20_3_7_adaptors adaptors for function pointers@endlink.
|
||||
template <class _Arg, class _Result>
|
||||
inline pointer_to_unary_function<_Arg, _Result>
|
||||
ptr_fun(_Result (*__x)(_Arg))
|
||||
{ return pointer_to_unary_function<_Arg, _Result>(__x); }
|
||||
|
||||
/// One of the @link s20_3_7_adaptors adaptors for function pointers@endlink.
|
||||
template <class _Arg1, class _Arg2, class _Result>
|
||||
class pointer_to_binary_function
|
||||
: public binary_function<_Arg1, _Arg2, _Result>
|
||||
{
|
||||
protected:
|
||||
_Result (*_M_ptr)(_Arg1, _Arg2);
|
||||
public:
|
||||
pointer_to_binary_function() {}
|
||||
|
||||
explicit
|
||||
pointer_to_binary_function(_Result (*__x)(_Arg1, _Arg2))
|
||||
: _M_ptr(__x) {}
|
||||
|
||||
_Result
|
||||
operator()(_Arg1 __x, _Arg2 __y) const
|
||||
{ return _M_ptr(__x, __y); }
|
||||
};
|
||||
|
||||
/// One of the @link s20_3_7_adaptors adaptors for function pointers@endlink.
|
||||
template <class _Arg1, class _Arg2, class _Result>
|
||||
inline pointer_to_binary_function<_Arg1, _Arg2, _Result>
|
||||
ptr_fun(_Result (*__x)(_Arg1, _Arg2))
|
||||
{ return pointer_to_binary_function<_Arg1, _Arg2, _Result>(__x); }
|
||||
/** @} */
|
||||
|
||||
template <class _Tp>
|
||||
struct _Identity : public unary_function<_Tp,_Tp>
|
||||
{
|
||||
_Tp&
|
||||
operator()(_Tp& __x) const
|
||||
{ return __x; }
|
||||
|
||||
const _Tp&
|
||||
operator()(const _Tp& __x) const
|
||||
{ return __x; }
|
||||
};
|
||||
|
||||
template <class _Pair>
|
||||
struct _Select1st : public unary_function<_Pair,
|
||||
typename _Pair::first_type>
|
||||
{
|
||||
typename _Pair::first_type&
|
||||
operator()(_Pair& __x) const
|
||||
{ return __x.first; }
|
||||
|
||||
const typename _Pair::first_type&
|
||||
operator()(const _Pair& __x) const
|
||||
{ return __x.first; }
|
||||
};
|
||||
|
||||
template <class _Pair>
|
||||
struct _Select2nd : public unary_function<_Pair,
|
||||
typename _Pair::second_type>
|
||||
{
|
||||
typename _Pair::second_type&
|
||||
operator()(_Pair& __x) const
|
||||
{ return __x.second; }
|
||||
|
||||
const typename _Pair::second_type&
|
||||
operator()(const _Pair& __x) const
|
||||
{ return __x.second; }
|
||||
};
|
||||
|
||||
// 20.3.8 adaptors pointers members
|
||||
/** @defgroup s20_3_8_memadaptors Adaptors for pointers to members
|
||||
* There are a total of 16 = 2^4 function objects in this family.
|
||||
* (1) Member functions taking no arguments vs member functions taking
|
||||
* one argument.
|
||||
* (2) Call through pointer vs call through reference.
|
||||
* (3) Member function with void return type vs member function with
|
||||
* non-void return type.
|
||||
* (4) Const vs non-const member function.
|
||||
*
|
||||
* Note that choice (3) is nothing more than a workaround: according
|
||||
* to the draft, compilers should handle void and non-void the same way.
|
||||
* This feature is not yet widely implemented, though. You can only use
|
||||
* member functions returning void if your compiler supports partial
|
||||
* specialization.
|
||||
*
|
||||
* All of this complexity is in the function objects themselves. You can
|
||||
* ignore it by using the helper function mem_fun and mem_fun_ref,
|
||||
* which create whichever type of adaptor is appropriate.
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
/// One of the @link s20_3_8_memadaptors adaptors for member pointers@endlink.
|
||||
template <class _Ret, class _Tp>
|
||||
class mem_fun_t : public unary_function<_Tp*, _Ret>
|
||||
{
|
||||
public:
|
||||
explicit
|
||||
mem_fun_t(_Ret (_Tp::*__pf)())
|
||||
: _M_f(__pf) {}
|
||||
|
||||
_Ret
|
||||
operator()(_Tp* __p) const
|
||||
{ return (__p->*_M_f)(); }
|
||||
private:
|
||||
_Ret (_Tp::*_M_f)();
|
||||
};
|
||||
|
||||
/// One of the @link s20_3_8_memadaptors adaptors for member pointers@endlink.
|
||||
template <class _Ret, class _Tp>
|
||||
class const_mem_fun_t : public unary_function<const _Tp*, _Ret>
|
||||
{
|
||||
public:
|
||||
explicit
|
||||
const_mem_fun_t(_Ret (_Tp::*__pf)() const)
|
||||
: _M_f(__pf) {}
|
||||
|
||||
_Ret
|
||||
operator()(const _Tp* __p) const
|
||||
{ return (__p->*_M_f)(); }
|
||||
private:
|
||||
_Ret (_Tp::*_M_f)() const;
|
||||
};
|
||||
|
||||
/// One of the @link s20_3_8_memadaptors adaptors for member pointers@endlink.
|
||||
template <class _Ret, class _Tp>
|
||||
class mem_fun_ref_t : public unary_function<_Tp, _Ret>
|
||||
{
|
||||
public:
|
||||
explicit
|
||||
mem_fun_ref_t(_Ret (_Tp::*__pf)())
|
||||
: _M_f(__pf) {}
|
||||
|
||||
_Ret
|
||||
operator()(_Tp& __r) const
|
||||
{ return (__r.*_M_f)(); }
|
||||
private:
|
||||
_Ret (_Tp::*_M_f)();
|
||||
};
|
||||
|
||||
/// One of the @link s20_3_8_memadaptors adaptors for member pointers@endlink.
|
||||
template <class _Ret, class _Tp>
|
||||
class const_mem_fun_ref_t : public unary_function<_Tp, _Ret>
|
||||
{
|
||||
public:
|
||||
explicit
|
||||
const_mem_fun_ref_t(_Ret (_Tp::*__pf)() const)
|
||||
: _M_f(__pf) {}
|
||||
|
||||
_Ret
|
||||
operator()(const _Tp& __r) const
|
||||
{ return (__r.*_M_f)(); }
|
||||
private:
|
||||
_Ret (_Tp::*_M_f)() const;
|
||||
};
|
||||
|
||||
/// One of the @link s20_3_8_memadaptors adaptors for member pointers@endlink.
|
||||
template <class _Ret, class _Tp, class _Arg>
|
||||
class mem_fun1_t : public binary_function<_Tp*, _Arg, _Ret>
|
||||
{
|
||||
public:
|
||||
explicit
|
||||
mem_fun1_t(_Ret (_Tp::*__pf)(_Arg))
|
||||
: _M_f(__pf) {}
|
||||
|
||||
_Ret
|
||||
operator()(_Tp* __p, _Arg __x) const
|
||||
{ return (__p->*_M_f)(__x); }
|
||||
private:
|
||||
_Ret (_Tp::*_M_f)(_Arg);
|
||||
};
|
||||
|
||||
/// One of the @link s20_3_8_memadaptors adaptors for member pointers@endlink.
|
||||
template <class _Ret, class _Tp, class _Arg>
|
||||
class const_mem_fun1_t : public binary_function<const _Tp*, _Arg, _Ret>
|
||||
{
|
||||
public:
|
||||
explicit
|
||||
const_mem_fun1_t(_Ret (_Tp::*__pf)(_Arg) const)
|
||||
: _M_f(__pf) {}
|
||||
|
||||
_Ret
|
||||
operator()(const _Tp* __p, _Arg __x) const
|
||||
{ return (__p->*_M_f)(__x); }
|
||||
private:
|
||||
_Ret (_Tp::*_M_f)(_Arg) const;
|
||||
};
|
||||
|
||||
/// One of the @link s20_3_8_memadaptors adaptors for member pointers@endlink.
|
||||
template <class _Ret, class _Tp, class _Arg>
|
||||
class mem_fun1_ref_t : public binary_function<_Tp, _Arg, _Ret>
|
||||
{
|
||||
public:
|
||||
explicit
|
||||
mem_fun1_ref_t(_Ret (_Tp::*__pf)(_Arg))
|
||||
: _M_f(__pf) {}
|
||||
|
||||
_Ret
|
||||
operator()(_Tp& __r, _Arg __x) const
|
||||
{ return (__r.*_M_f)(__x); }
|
||||
private:
|
||||
_Ret (_Tp::*_M_f)(_Arg);
|
||||
};
|
||||
|
||||
/// One of the @link s20_3_8_memadaptors adaptors for member pointers@endlink.
|
||||
template <class _Ret, class _Tp, class _Arg>
|
||||
class const_mem_fun1_ref_t : public binary_function<_Tp, _Arg, _Ret>
|
||||
{
|
||||
public:
|
||||
explicit
|
||||
const_mem_fun1_ref_t(_Ret (_Tp::*__pf)(_Arg) const)
|
||||
: _M_f(__pf) {}
|
||||
|
||||
_Ret
|
||||
operator()(const _Tp& __r, _Arg __x) const
|
||||
{ return (__r.*_M_f)(__x); }
|
||||
private:
|
||||
_Ret (_Tp::*_M_f)(_Arg) const;
|
||||
};
|
||||
|
||||
/// One of the @link s20_3_8_memadaptors adaptors for member pointers@endlink.
|
||||
template <class _Tp>
|
||||
class mem_fun_t<void, _Tp> : public unary_function<_Tp*, void>
|
||||
{
|
||||
public:
|
||||
explicit
|
||||
mem_fun_t(void (_Tp::*__pf)())
|
||||
: _M_f(__pf) {}
|
||||
|
||||
void
|
||||
operator()(_Tp* __p) const
|
||||
{ (__p->*_M_f)(); }
|
||||
private:
|
||||
void (_Tp::*_M_f)();
|
||||
};
|
||||
|
||||
/// One of the @link s20_3_8_memadaptors adaptors for member pointers@endlink.
|
||||
template <class _Tp>
|
||||
class const_mem_fun_t<void, _Tp> : public unary_function<const _Tp*, void>
|
||||
{
|
||||
public:
|
||||
explicit
|
||||
const_mem_fun_t(void (_Tp::*__pf)() const)
|
||||
: _M_f(__pf) {}
|
||||
|
||||
void
|
||||
operator()(const _Tp* __p) const
|
||||
{ (__p->*_M_f)(); }
|
||||
private:
|
||||
void (_Tp::*_M_f)() const;
|
||||
};
|
||||
|
||||
/// One of the @link s20_3_8_memadaptors adaptors for member pointers@endlink.
|
||||
template <class _Tp>
|
||||
class mem_fun_ref_t<void, _Tp> : public unary_function<_Tp, void>
|
||||
{
|
||||
public:
|
||||
explicit
|
||||
mem_fun_ref_t(void (_Tp::*__pf)())
|
||||
: _M_f(__pf) {}
|
||||
|
||||
void
|
||||
operator()(_Tp& __r) const
|
||||
{ (__r.*_M_f)(); }
|
||||
private:
|
||||
void (_Tp::*_M_f)();
|
||||
};
|
||||
|
||||
/// One of the @link s20_3_8_memadaptors adaptors for member pointers@endlink.
|
||||
template <class _Tp>
|
||||
class const_mem_fun_ref_t<void, _Tp> : public unary_function<_Tp, void>
|
||||
{
|
||||
public:
|
||||
explicit
|
||||
const_mem_fun_ref_t(void (_Tp::*__pf)() const)
|
||||
: _M_f(__pf) {}
|
||||
|
||||
void
|
||||
operator()(const _Tp& __r) const
|
||||
{ (__r.*_M_f)(); }
|
||||
private:
|
||||
void (_Tp::*_M_f)() const;
|
||||
};
|
||||
|
||||
/// One of the @link s20_3_8_memadaptors adaptors for member pointers@endlink.
|
||||
template <class _Tp, class _Arg>
|
||||
class mem_fun1_t<void, _Tp, _Arg> : public binary_function<_Tp*, _Arg, void>
|
||||
{
|
||||
public:
|
||||
explicit
|
||||
mem_fun1_t(void (_Tp::*__pf)(_Arg))
|
||||
: _M_f(__pf) {}
|
||||
|
||||
void
|
||||
operator()(_Tp* __p, _Arg __x) const
|
||||
{ (__p->*_M_f)(__x); }
|
||||
private:
|
||||
void (_Tp::*_M_f)(_Arg);
|
||||
};
|
||||
|
||||
/// One of the @link s20_3_8_memadaptors adaptors for member pointers@endlink.
|
||||
template <class _Tp, class _Arg>
|
||||
class const_mem_fun1_t<void, _Tp, _Arg>
|
||||
: public binary_function<const _Tp*, _Arg, void>
|
||||
{
|
||||
public:
|
||||
explicit
|
||||
const_mem_fun1_t(void (_Tp::*__pf)(_Arg) const)
|
||||
: _M_f(__pf) {}
|
||||
|
||||
void
|
||||
operator()(const _Tp* __p, _Arg __x) const
|
||||
{ (__p->*_M_f)(__x); }
|
||||
private:
|
||||
void (_Tp::*_M_f)(_Arg) const;
|
||||
};
|
||||
|
||||
/// One of the @link s20_3_8_memadaptors adaptors for member pointers@endlink.
|
||||
template <class _Tp, class _Arg>
|
||||
class mem_fun1_ref_t<void, _Tp, _Arg>
|
||||
: public binary_function<_Tp, _Arg, void>
|
||||
{
|
||||
public:
|
||||
explicit
|
||||
mem_fun1_ref_t(void (_Tp::*__pf)(_Arg))
|
||||
: _M_f(__pf) {}
|
||||
|
||||
void
|
||||
operator()(_Tp& __r, _Arg __x) const
|
||||
{ (__r.*_M_f)(__x); }
|
||||
private:
|
||||
void (_Tp::*_M_f)(_Arg);
|
||||
};
|
||||
|
||||
/// One of the @link s20_3_8_memadaptors adaptors for member pointers@endlink.
|
||||
template <class _Tp, class _Arg>
|
||||
class const_mem_fun1_ref_t<void, _Tp, _Arg>
|
||||
: public binary_function<_Tp, _Arg, void>
|
||||
{
|
||||
public:
|
||||
explicit
|
||||
const_mem_fun1_ref_t(void (_Tp::*__pf)(_Arg) const)
|
||||
: _M_f(__pf) {}
|
||||
|
||||
void
|
||||
operator()(const _Tp& __r, _Arg __x) const
|
||||
{ (__r.*_M_f)(__x); }
|
||||
private:
|
||||
void (_Tp::*_M_f)(_Arg) const;
|
||||
};
|
||||
|
||||
// Mem_fun adaptor helper functions. There are only two:
|
||||
// mem_fun and mem_fun_ref.
|
||||
template <class _Ret, class _Tp>
|
||||
inline mem_fun_t<_Ret, _Tp>
|
||||
mem_fun(_Ret (_Tp::*__f)())
|
||||
{ return mem_fun_t<_Ret, _Tp>(__f); }
|
||||
|
||||
template <class _Ret, class _Tp>
|
||||
inline const_mem_fun_t<_Ret, _Tp>
|
||||
mem_fun(_Ret (_Tp::*__f)() const)
|
||||
{ return const_mem_fun_t<_Ret, _Tp>(__f); }
|
||||
|
||||
template <class _Ret, class _Tp>
|
||||
inline mem_fun_ref_t<_Ret, _Tp>
|
||||
mem_fun_ref(_Ret (_Tp::*__f)())
|
||||
{ return mem_fun_ref_t<_Ret, _Tp>(__f); }
|
||||
|
||||
template <class _Ret, class _Tp>
|
||||
inline const_mem_fun_ref_t<_Ret, _Tp>
|
||||
mem_fun_ref(_Ret (_Tp::*__f)() const)
|
||||
{ return const_mem_fun_ref_t<_Ret, _Tp>(__f); }
|
||||
|
||||
template <class _Ret, class _Tp, class _Arg>
|
||||
inline mem_fun1_t<_Ret, _Tp, _Arg>
|
||||
mem_fun(_Ret (_Tp::*__f)(_Arg))
|
||||
{ return mem_fun1_t<_Ret, _Tp, _Arg>(__f); }
|
||||
|
||||
template <class _Ret, class _Tp, class _Arg>
|
||||
inline const_mem_fun1_t<_Ret, _Tp, _Arg>
|
||||
mem_fun(_Ret (_Tp::*__f)(_Arg) const)
|
||||
{ return const_mem_fun1_t<_Ret, _Tp, _Arg>(__f); }
|
||||
|
||||
template <class _Ret, class _Tp, class _Arg>
|
||||
inline mem_fun1_ref_t<_Ret, _Tp, _Arg>
|
||||
mem_fun_ref(_Ret (_Tp::*__f)(_Arg))
|
||||
{ return mem_fun1_ref_t<_Ret, _Tp, _Arg>(__f); }
|
||||
|
||||
template <class _Ret, class _Tp, class _Arg>
|
||||
inline const_mem_fun1_ref_t<_Ret, _Tp, _Arg>
|
||||
mem_fun_ref(_Ret (_Tp::*__f)(_Arg) const)
|
||||
{ return const_mem_fun1_ref_t<_Ret, _Tp, _Arg>(__f); }
|
||||
|
||||
/** @} */
|
||||
|
||||
} // namespace std
|
||||
|
||||
#endif /* _FUNCTION_H */
|
||||
|
||||
// Local Variables:
|
||||
// mode:C++
|
||||
// End:
|
||||
@ -0,0 +1,467 @@
|
||||
// Heap implementation -*- C++ -*-
|
||||
|
||||
// Copyright (C) 2001, 2004 Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 2, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING. If not, write to the Free
|
||||
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
// USA.
|
||||
|
||||
// As a special exception, you may use this file as part of a free software
|
||||
// library without restriction. Specifically, if other files instantiate
|
||||
// templates or use macros or inline functions from this file, or you compile
|
||||
// this file and link it with other files to produce an executable, this
|
||||
// file does not by itself cause the resulting executable to be covered by
|
||||
// the GNU General Public License. This exception does not however
|
||||
// invalidate any other reasons why the executable file might be covered by
|
||||
// the GNU General Public License.
|
||||
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 1994
|
||||
* Hewlett-Packard Company
|
||||
*
|
||||
* Permission to use, copy, modify, distribute and sell this software
|
||||
* and its documentation for any purpose is hereby granted without fee,
|
||||
* provided that the above copyright notice appear in all copies and
|
||||
* that both that copyright notice and this permission notice appear
|
||||
* in supporting documentation. Hewlett-Packard Company makes no
|
||||
* representations about the suitability of this software for any
|
||||
* purpose. It is provided "as is" without express or implied warranty.
|
||||
*
|
||||
* Copyright (c) 1997
|
||||
* Silicon Graphics Computer Systems, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, distribute and sell this software
|
||||
* and its documentation for any purpose is hereby granted without fee,
|
||||
* provided that the above copyright notice appear in all copies and
|
||||
* that both that copyright notice and this permission notice appear
|
||||
* in supporting documentation. Silicon Graphics makes no
|
||||
* representations about the suitability of this software for any
|
||||
* purpose. It is provided "as is" without express or implied warranty.
|
||||
*/
|
||||
|
||||
/** @file stl_heap.h
|
||||
* This is an internal header file, included by other library headers.
|
||||
* You should not attempt to use it directly.
|
||||
*/
|
||||
|
||||
#ifndef _STL_HEAP_H
|
||||
#define _STL_HEAP_H 1
|
||||
|
||||
#include <debug/debug.h>
|
||||
|
||||
namespace std
|
||||
{
|
||||
// is_heap, a predicate testing whether or not a range is
|
||||
// a heap. This function is an extension, not part of the C++
|
||||
// standard.
|
||||
template<typename _RandomAccessIterator, typename _Distance>
|
||||
bool
|
||||
__is_heap(_RandomAccessIterator __first, _Distance __n)
|
||||
{
|
||||
_Distance __parent = 0;
|
||||
for (_Distance __child = 1; __child < __n; ++__child)
|
||||
{
|
||||
if (__first[__parent] < __first[__child])
|
||||
return false;
|
||||
if ((__child & 1) == 0)
|
||||
++__parent;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
template<typename _RandomAccessIterator, typename _Distance,
|
||||
typename _StrictWeakOrdering>
|
||||
bool
|
||||
__is_heap(_RandomAccessIterator __first, _StrictWeakOrdering __comp,
|
||||
_Distance __n)
|
||||
{
|
||||
_Distance __parent = 0;
|
||||
for (_Distance __child = 1; __child < __n; ++__child)
|
||||
{
|
||||
if (__comp(__first[__parent], __first[__child]))
|
||||
return false;
|
||||
if ((__child & 1) == 0)
|
||||
++__parent;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
template<typename _RandomAccessIterator>
|
||||
bool
|
||||
__is_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
|
||||
{ return std::__is_heap(__first, std::distance(__first, __last)); }
|
||||
|
||||
template<typename _RandomAccessIterator, typename _StrictWeakOrdering>
|
||||
bool
|
||||
__is_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
|
||||
_StrictWeakOrdering __comp)
|
||||
{ return std::__is_heap(__first, __comp, std::distance(__first, __last)); }
|
||||
|
||||
// Heap-manipulation functions: push_heap, pop_heap, make_heap, sort_heap.
|
||||
|
||||
template<typename _RandomAccessIterator, typename _Distance, typename _Tp>
|
||||
void
|
||||
__push_heap(_RandomAccessIterator __first,
|
||||
_Distance __holeIndex, _Distance __topIndex, _Tp __value)
|
||||
{
|
||||
_Distance __parent = (__holeIndex - 1) / 2;
|
||||
while (__holeIndex > __topIndex && *(__first + __parent) < __value)
|
||||
{
|
||||
*(__first + __holeIndex) = *(__first + __parent);
|
||||
__holeIndex = __parent;
|
||||
__parent = (__holeIndex - 1) / 2;
|
||||
}
|
||||
*(__first + __holeIndex) = __value;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Push an element onto a heap.
|
||||
* @param first Start of heap.
|
||||
* @param last End of heap + element.
|
||||
* @ingroup heap
|
||||
*
|
||||
* This operation pushes the element at last-1 onto the valid heap over the
|
||||
* range [first,last-1). After completion, [first,last) is a valid heap.
|
||||
*/
|
||||
template<typename _RandomAccessIterator>
|
||||
inline void
|
||||
push_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
|
||||
{
|
||||
typedef typename iterator_traits<_RandomAccessIterator>::value_type
|
||||
_ValueType;
|
||||
typedef typename iterator_traits<_RandomAccessIterator>::difference_type
|
||||
_DistanceType;
|
||||
|
||||
// concept requirements
|
||||
__glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
|
||||
_RandomAccessIterator>)
|
||||
__glibcxx_function_requires(_LessThanComparableConcept<_ValueType>)
|
||||
__glibcxx_requires_valid_range(__first, __last);
|
||||
// __glibcxx_requires_heap(__first, __last - 1);
|
||||
|
||||
std::__push_heap(__first, _DistanceType((__last - __first) - 1),
|
||||
_DistanceType(0), _ValueType(*(__last - 1)));
|
||||
}
|
||||
|
||||
template<typename _RandomAccessIterator, typename _Distance, typename _Tp,
|
||||
typename _Compare>
|
||||
void
|
||||
__push_heap(_RandomAccessIterator __first, _Distance __holeIndex,
|
||||
_Distance __topIndex, _Tp __value, _Compare __comp)
|
||||
{
|
||||
_Distance __parent = (__holeIndex - 1) / 2;
|
||||
while (__holeIndex > __topIndex
|
||||
&& __comp(*(__first + __parent), __value))
|
||||
{
|
||||
*(__first + __holeIndex) = *(__first + __parent);
|
||||
__holeIndex = __parent;
|
||||
__parent = (__holeIndex - 1) / 2;
|
||||
}
|
||||
*(__first + __holeIndex) = __value;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Push an element onto a heap using comparison functor.
|
||||
* @param first Start of heap.
|
||||
* @param last End of heap + element.
|
||||
* @param comp Comparison functor.
|
||||
* @ingroup heap
|
||||
*
|
||||
* This operation pushes the element at last-1 onto the valid heap over the
|
||||
* range [first,last-1). After completion, [first,last) is a valid heap.
|
||||
* Compare operations are performed using comp.
|
||||
*/
|
||||
template<typename _RandomAccessIterator, typename _Compare>
|
||||
inline void
|
||||
push_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
|
||||
_Compare __comp)
|
||||
{
|
||||
typedef typename iterator_traits<_RandomAccessIterator>::value_type
|
||||
_ValueType;
|
||||
typedef typename iterator_traits<_RandomAccessIterator>::difference_type
|
||||
_DistanceType;
|
||||
|
||||
// concept requirements
|
||||
__glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
|
||||
_RandomAccessIterator>)
|
||||
__glibcxx_requires_valid_range(__first, __last);
|
||||
__glibcxx_requires_heap_pred(__first, __last - 1, __comp);
|
||||
|
||||
std::__push_heap(__first, _DistanceType((__last - __first) - 1),
|
||||
_DistanceType(0), _ValueType(*(__last - 1)), __comp);
|
||||
}
|
||||
|
||||
template<typename _RandomAccessIterator, typename _Distance, typename _Tp>
|
||||
void
|
||||
__adjust_heap(_RandomAccessIterator __first, _Distance __holeIndex,
|
||||
_Distance __len, _Tp __value)
|
||||
{
|
||||
const _Distance __topIndex = __holeIndex;
|
||||
_Distance __secondChild = 2 * __holeIndex + 2;
|
||||
while (__secondChild < __len)
|
||||
{
|
||||
if (*(__first + __secondChild) < *(__first + (__secondChild - 1)))
|
||||
__secondChild--;
|
||||
*(__first + __holeIndex) = *(__first + __secondChild);
|
||||
__holeIndex = __secondChild;
|
||||
__secondChild = 2 * (__secondChild + 1);
|
||||
}
|
||||
if (__secondChild == __len)
|
||||
{
|
||||
*(__first + __holeIndex) = *(__first + (__secondChild - 1));
|
||||
__holeIndex = __secondChild - 1;
|
||||
}
|
||||
std::__push_heap(__first, __holeIndex, __topIndex, __value);
|
||||
}
|
||||
|
||||
template<typename _RandomAccessIterator, typename _Tp>
|
||||
inline void
|
||||
__pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
|
||||
_RandomAccessIterator __result, _Tp __value)
|
||||
{
|
||||
typedef typename iterator_traits<_RandomAccessIterator>::difference_type
|
||||
_Distance;
|
||||
*__result = *__first;
|
||||
std::__adjust_heap(__first, _Distance(0), _Distance(__last - __first),
|
||||
__value);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Pop an element off a heap.
|
||||
* @param first Start of heap.
|
||||
* @param last End of heap.
|
||||
* @ingroup heap
|
||||
*
|
||||
* This operation pops the top of the heap. The elements first and last-1
|
||||
* are swapped and [first,last-1) is made into a heap.
|
||||
*/
|
||||
template<typename _RandomAccessIterator>
|
||||
inline void
|
||||
pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
|
||||
{
|
||||
typedef typename iterator_traits<_RandomAccessIterator>::value_type
|
||||
_ValueType;
|
||||
|
||||
// concept requirements
|
||||
__glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
|
||||
_RandomAccessIterator>)
|
||||
__glibcxx_function_requires(_LessThanComparableConcept<_ValueType>)
|
||||
__glibcxx_requires_valid_range(__first, __last);
|
||||
__glibcxx_requires_heap(__first, __last);
|
||||
|
||||
std::__pop_heap(__first, __last - 1, __last - 1,
|
||||
_ValueType(*(__last - 1)));
|
||||
}
|
||||
|
||||
template<typename _RandomAccessIterator, typename _Distance,
|
||||
typename _Tp, typename _Compare>
|
||||
void
|
||||
__adjust_heap(_RandomAccessIterator __first, _Distance __holeIndex,
|
||||
_Distance __len, _Tp __value, _Compare __comp)
|
||||
{
|
||||
const _Distance __topIndex = __holeIndex;
|
||||
_Distance __secondChild = 2 * __holeIndex + 2;
|
||||
while (__secondChild < __len)
|
||||
{
|
||||
if (__comp(*(__first + __secondChild),
|
||||
*(__first + (__secondChild - 1))))
|
||||
__secondChild--;
|
||||
*(__first + __holeIndex) = *(__first + __secondChild);
|
||||
__holeIndex = __secondChild;
|
||||
__secondChild = 2 * (__secondChild + 1);
|
||||
}
|
||||
if (__secondChild == __len)
|
||||
{
|
||||
*(__first + __holeIndex) = *(__first + (__secondChild - 1));
|
||||
__holeIndex = __secondChild - 1;
|
||||
}
|
||||
std::__push_heap(__first, __holeIndex, __topIndex, __value, __comp);
|
||||
}
|
||||
|
||||
template<typename _RandomAccessIterator, typename _Tp, typename _Compare>
|
||||
inline void
|
||||
__pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
|
||||
_RandomAccessIterator __result, _Tp __value, _Compare __comp)
|
||||
{
|
||||
typedef typename iterator_traits<_RandomAccessIterator>::difference_type
|
||||
_Distance;
|
||||
*__result = *__first;
|
||||
std::__adjust_heap(__first, _Distance(0), _Distance(__last - __first),
|
||||
__value, __comp);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Pop an element off a heap using comparison functor.
|
||||
* @param first Start of heap.
|
||||
* @param last End of heap.
|
||||
* @param comp Comparison functor to use.
|
||||
* @ingroup heap
|
||||
*
|
||||
* This operation pops the top of the heap. The elements first and last-1
|
||||
* are swapped and [first,last-1) is made into a heap. Comparisons are
|
||||
* made using comp.
|
||||
*/
|
||||
template<typename _RandomAccessIterator, typename _Compare>
|
||||
inline void
|
||||
pop_heap(_RandomAccessIterator __first,
|
||||
_RandomAccessIterator __last, _Compare __comp)
|
||||
{
|
||||
// concept requirements
|
||||
__glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
|
||||
_RandomAccessIterator>)
|
||||
__glibcxx_requires_valid_range(__first, __last);
|
||||
__glibcxx_requires_heap_pred(__first, __last, __comp);
|
||||
|
||||
typedef typename iterator_traits<_RandomAccessIterator>::value_type
|
||||
_ValueType;
|
||||
std::__pop_heap(__first, __last - 1, __last - 1,
|
||||
_ValueType(*(__last - 1)), __comp);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Construct a heap over a range.
|
||||
* @param first Start of heap.
|
||||
* @param last End of heap.
|
||||
* @ingroup heap
|
||||
*
|
||||
* This operation makes the elements in [first,last) into a heap.
|
||||
*/
|
||||
template<typename _RandomAccessIterator>
|
||||
void
|
||||
make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
|
||||
{
|
||||
typedef typename iterator_traits<_RandomAccessIterator>::value_type
|
||||
_ValueType;
|
||||
typedef typename iterator_traits<_RandomAccessIterator>::difference_type
|
||||
_DistanceType;
|
||||
|
||||
// concept requirements
|
||||
__glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
|
||||
_RandomAccessIterator>)
|
||||
__glibcxx_function_requires(_LessThanComparableConcept<_ValueType>)
|
||||
__glibcxx_requires_valid_range(__first, __last);
|
||||
|
||||
if (__last - __first < 2)
|
||||
return;
|
||||
|
||||
const _DistanceType __len = __last - __first;
|
||||
_DistanceType __parent = (__len - 2) / 2;
|
||||
while (true)
|
||||
{
|
||||
std::__adjust_heap(__first, __parent, __len,
|
||||
_ValueType(*(__first + __parent)));
|
||||
if (__parent == 0)
|
||||
return;
|
||||
__parent--;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Construct a heap over a range using comparison functor.
|
||||
* @param first Start of heap.
|
||||
* @param last End of heap.
|
||||
* @param comp Comparison functor to use.
|
||||
* @ingroup heap
|
||||
*
|
||||
* This operation makes the elements in [first,last) into a heap.
|
||||
* Comparisons are made using comp.
|
||||
*/
|
||||
template<typename _RandomAccessIterator, typename _Compare>
|
||||
inline void
|
||||
make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
|
||||
_Compare __comp)
|
||||
{
|
||||
typedef typename iterator_traits<_RandomAccessIterator>::value_type
|
||||
_ValueType;
|
||||
typedef typename iterator_traits<_RandomAccessIterator>::difference_type
|
||||
_DistanceType;
|
||||
|
||||
// concept requirements
|
||||
__glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
|
||||
_RandomAccessIterator>)
|
||||
__glibcxx_requires_valid_range(__first, __last);
|
||||
|
||||
if (__last - __first < 2)
|
||||
return;
|
||||
|
||||
const _DistanceType __len = __last - __first;
|
||||
_DistanceType __parent = (__len - 2) / 2;
|
||||
while (true)
|
||||
{
|
||||
std::__adjust_heap(__first, __parent, __len,
|
||||
_ValueType(*(__first + __parent)), __comp);
|
||||
if (__parent == 0)
|
||||
return;
|
||||
__parent--;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Sort a heap.
|
||||
* @param first Start of heap.
|
||||
* @param last End of heap.
|
||||
* @ingroup heap
|
||||
*
|
||||
* This operation sorts the valid heap in the range [first,last).
|
||||
*/
|
||||
template<typename _RandomAccessIterator>
|
||||
void
|
||||
sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
|
||||
{
|
||||
// concept requirements
|
||||
__glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
|
||||
_RandomAccessIterator>)
|
||||
__glibcxx_function_requires(_LessThanComparableConcept<
|
||||
typename iterator_traits<_RandomAccessIterator>::value_type>)
|
||||
__glibcxx_requires_valid_range(__first, __last);
|
||||
// __glibcxx_requires_heap(__first, __last);
|
||||
|
||||
while (__last - __first > 1)
|
||||
std::pop_heap(__first, __last--);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Sort a heap using comparison functor.
|
||||
* @param first Start of heap.
|
||||
* @param last End of heap.
|
||||
* @param comp Comparison functor to use.
|
||||
* @ingroup heap
|
||||
*
|
||||
* This operation sorts the valid heap in the range [first,last).
|
||||
* Comparisons are made using comp.
|
||||
*/
|
||||
template<typename _RandomAccessIterator, typename _Compare>
|
||||
void
|
||||
sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
|
||||
_Compare __comp)
|
||||
{
|
||||
// concept requirements
|
||||
__glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
|
||||
_RandomAccessIterator>)
|
||||
__glibcxx_requires_valid_range(__first, __last);
|
||||
__glibcxx_requires_heap_pred(__first, __last, __comp);
|
||||
|
||||
while (__last - __first > 1)
|
||||
std::pop_heap(__first, __last--, __comp);
|
||||
}
|
||||
|
||||
} // namespace std
|
||||
|
||||
#endif /* _STL_HEAP_H */
|
||||
|
||||
// Local Variables:
|
||||
// mode:C++
|
||||
// End:
|
||||
@ -0,0 +1,772 @@
|
||||
// Iterators -*- C++ -*-
|
||||
|
||||
// Copyright (C) 2001, 2002, 2004 Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 2, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING. If not, write to the Free
|
||||
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
// USA.
|
||||
|
||||
// As a special exception, you may use this file as part of a free software
|
||||
// library without restriction. Specifically, if other files instantiate
|
||||
// templates or use macros or inline functions from this file, or you compile
|
||||
// this file and link it with other files to produce an executable, this
|
||||
// file does not by itself cause the resulting executable to be covered by
|
||||
// the GNU General Public License. This exception does not however
|
||||
// invalidate any other reasons why the executable file might be covered by
|
||||
// the GNU General Public License.
|
||||
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 1994
|
||||
* Hewlett-Packard Company
|
||||
*
|
||||
* Permission to use, copy, modify, distribute and sell this software
|
||||
* and its documentation for any purpose is hereby granted without fee,
|
||||
* provided that the above copyright notice appear in all copies and
|
||||
* that both that copyright notice and this permission notice appear
|
||||
* in supporting documentation. Hewlett-Packard Company makes no
|
||||
* representations about the suitability of this software for any
|
||||
* purpose. It is provided "as is" without express or implied warranty.
|
||||
*
|
||||
*
|
||||
* Copyright (c) 1996-1998
|
||||
* Silicon Graphics Computer Systems, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, distribute and sell this software
|
||||
* and its documentation for any purpose is hereby granted without fee,
|
||||
* provided that the above copyright notice appear in all copies and
|
||||
* that both that copyright notice and this permission notice appear
|
||||
* in supporting documentation. Silicon Graphics makes no
|
||||
* representations about the suitability of this software for any
|
||||
* purpose. It is provided "as is" without express or implied warranty.
|
||||
*/
|
||||
|
||||
/** @file stl_iterator.h
|
||||
* This is an internal header file, included by other library headers.
|
||||
* You should not attempt to use it directly.
|
||||
*
|
||||
* This file implements reverse_iterator, back_insert_iterator,
|
||||
* front_insert_iterator, insert_iterator, __normal_iterator, and their
|
||||
* supporting functions and overloaded operators.
|
||||
*/
|
||||
|
||||
#ifndef _ITERATOR_H
|
||||
#define _ITERATOR_H 1
|
||||
|
||||
namespace std
|
||||
{
|
||||
// 24.4.1 Reverse iterators
|
||||
/**
|
||||
* "Bidirectional and random access iterators have corresponding reverse
|
||||
* %iterator adaptors that iterate through the data structure in the
|
||||
* opposite direction. They have the same signatures as the corresponding
|
||||
* iterators. The fundamental relation between a reverse %iterator and its
|
||||
* corresponding %iterator @c i is established by the identity:
|
||||
* @code
|
||||
* &*(reverse_iterator(i)) == &*(i - 1)
|
||||
* @endcode
|
||||
*
|
||||
* This mapping is dictated by the fact that while there is always a
|
||||
* pointer past the end of an array, there might not be a valid pointer
|
||||
* before the beginning of an array." [24.4.1]/1,2
|
||||
*
|
||||
* Reverse iterators can be tricky and surprising at first. Their
|
||||
* semantics make sense, however, and the trickiness is a side effect of
|
||||
* the requirement that the iterators must be safe.
|
||||
*/
|
||||
template<typename _Iterator>
|
||||
class reverse_iterator
|
||||
: public iterator<typename iterator_traits<_Iterator>::iterator_category,
|
||||
typename iterator_traits<_Iterator>::value_type,
|
||||
typename iterator_traits<_Iterator>::difference_type,
|
||||
typename iterator_traits<_Iterator>::pointer,
|
||||
typename iterator_traits<_Iterator>::reference>
|
||||
{
|
||||
protected:
|
||||
_Iterator current;
|
||||
|
||||
public:
|
||||
typedef _Iterator iterator_type;
|
||||
typedef typename iterator_traits<_Iterator>::difference_type
|
||||
difference_type;
|
||||
typedef typename iterator_traits<_Iterator>::reference reference;
|
||||
typedef typename iterator_traits<_Iterator>::pointer pointer;
|
||||
|
||||
public:
|
||||
/**
|
||||
* The default constructor default-initializes member @p current.
|
||||
* If it is a pointer, that means it is zero-initialized.
|
||||
*/
|
||||
// _GLIBCXX_RESOLVE_LIB_DEFECTS
|
||||
// 235 No specification of default ctor for reverse_iterator
|
||||
reverse_iterator() : current() { }
|
||||
|
||||
/**
|
||||
* This %iterator will move in the opposite direction that @p x does.
|
||||
*/
|
||||
explicit
|
||||
reverse_iterator(iterator_type __x) : current(__x) { }
|
||||
|
||||
/**
|
||||
* The copy constructor is normal.
|
||||
*/
|
||||
reverse_iterator(const reverse_iterator& __x)
|
||||
: current(__x.current) { }
|
||||
|
||||
/**
|
||||
* A reverse_iterator across other types can be copied in the normal
|
||||
* fashion.
|
||||
*/
|
||||
template<typename _Iter>
|
||||
reverse_iterator(const reverse_iterator<_Iter>& __x)
|
||||
: current(__x.base()) { }
|
||||
|
||||
/**
|
||||
* @return @c current, the %iterator used for underlying work.
|
||||
*/
|
||||
iterator_type
|
||||
base() const
|
||||
{ return current; }
|
||||
|
||||
/**
|
||||
* @return TODO
|
||||
*
|
||||
* @doctodo
|
||||
*/
|
||||
reference
|
||||
operator*() const
|
||||
{
|
||||
_Iterator __tmp = current;
|
||||
return *--__tmp;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return TODO
|
||||
*
|
||||
* @doctodo
|
||||
*/
|
||||
pointer
|
||||
operator->() const
|
||||
{ return &(operator*()); }
|
||||
|
||||
/**
|
||||
* @return TODO
|
||||
*
|
||||
* @doctodo
|
||||
*/
|
||||
reverse_iterator&
|
||||
operator++()
|
||||
{
|
||||
--current;
|
||||
return *this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return TODO
|
||||
*
|
||||
* @doctodo
|
||||
*/
|
||||
reverse_iterator
|
||||
operator++(int)
|
||||
{
|
||||
reverse_iterator __tmp = *this;
|
||||
--current;
|
||||
return __tmp;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return TODO
|
||||
*
|
||||
* @doctodo
|
||||
*/
|
||||
reverse_iterator&
|
||||
operator--()
|
||||
{
|
||||
++current;
|
||||
return *this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return TODO
|
||||
*
|
||||
* @doctodo
|
||||
*/
|
||||
reverse_iterator operator--(int)
|
||||
{
|
||||
reverse_iterator __tmp = *this;
|
||||
++current;
|
||||
return __tmp;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return TODO
|
||||
*
|
||||
* @doctodo
|
||||
*/
|
||||
reverse_iterator
|
||||
operator+(difference_type __n) const
|
||||
{ return reverse_iterator(current - __n); }
|
||||
|
||||
/**
|
||||
* @return TODO
|
||||
*
|
||||
* @doctodo
|
||||
*/
|
||||
reverse_iterator&
|
||||
operator+=(difference_type __n)
|
||||
{
|
||||
current -= __n;
|
||||
return *this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return TODO
|
||||
*
|
||||
* @doctodo
|
||||
*/
|
||||
reverse_iterator
|
||||
operator-(difference_type __n) const
|
||||
{ return reverse_iterator(current + __n); }
|
||||
|
||||
/**
|
||||
* @return TODO
|
||||
*
|
||||
* @doctodo
|
||||
*/
|
||||
reverse_iterator&
|
||||
operator-=(difference_type __n)
|
||||
{
|
||||
current += __n;
|
||||
return *this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return TODO
|
||||
*
|
||||
* @doctodo
|
||||
*/
|
||||
reference
|
||||
operator[](difference_type __n) const
|
||||
{ return *(*this + __n); }
|
||||
};
|
||||
|
||||
//@{
|
||||
/**
|
||||
* @param x A %reverse_iterator.
|
||||
* @param y A %reverse_iterator.
|
||||
* @return A simple bool.
|
||||
*
|
||||
* Reverse iterators forward many operations to their underlying base()
|
||||
* iterators. Others are implemented in terms of one another.
|
||||
*
|
||||
*/
|
||||
template<typename _Iterator>
|
||||
inline bool
|
||||
operator==(const reverse_iterator<_Iterator>& __x,
|
||||
const reverse_iterator<_Iterator>& __y)
|
||||
{ return __x.base() == __y.base(); }
|
||||
|
||||
template<typename _Iterator>
|
||||
inline bool
|
||||
operator<(const reverse_iterator<_Iterator>& __x,
|
||||
const reverse_iterator<_Iterator>& __y)
|
||||
{ return __y.base() < __x.base(); }
|
||||
|
||||
template<typename _Iterator>
|
||||
inline bool
|
||||
operator!=(const reverse_iterator<_Iterator>& __x,
|
||||
const reverse_iterator<_Iterator>& __y)
|
||||
{ return !(__x == __y); }
|
||||
|
||||
template<typename _Iterator>
|
||||
inline bool
|
||||
operator>(const reverse_iterator<_Iterator>& __x,
|
||||
const reverse_iterator<_Iterator>& __y)
|
||||
{ return __y < __x; }
|
||||
|
||||
template<typename _Iterator>
|
||||
inline bool
|
||||
operator<=(const reverse_iterator<_Iterator>& __x,
|
||||
const reverse_iterator<_Iterator>& __y)
|
||||
{ return !(__y < __x); }
|
||||
|
||||
template<typename _Iterator>
|
||||
inline bool
|
||||
operator>=(const reverse_iterator<_Iterator>& __x,
|
||||
const reverse_iterator<_Iterator>& __y)
|
||||
{ return !(__x < __y); }
|
||||
|
||||
template<typename _Iterator>
|
||||
inline typename reverse_iterator<_Iterator>::difference_type
|
||||
operator-(const reverse_iterator<_Iterator>& __x,
|
||||
const reverse_iterator<_Iterator>& __y)
|
||||
{ return __y.base() - __x.base(); }
|
||||
|
||||
template<typename _Iterator>
|
||||
inline reverse_iterator<_Iterator>
|
||||
operator+(typename reverse_iterator<_Iterator>::difference_type __n,
|
||||
const reverse_iterator<_Iterator>& __x)
|
||||
{ return reverse_iterator<_Iterator>(__x.base() - __n); }
|
||||
//@}
|
||||
|
||||
// 24.4.2.2.1 back_insert_iterator
|
||||
/**
|
||||
* @brief Turns assignment into insertion.
|
||||
*
|
||||
* These are output iterators, constructed from a container-of-T.
|
||||
* Assigning a T to the iterator appends it to the container using
|
||||
* push_back.
|
||||
*
|
||||
* Tip: Using the back_inserter function to create these iterators can
|
||||
* save typing.
|
||||
*/
|
||||
template<typename _Container>
|
||||
class back_insert_iterator
|
||||
: public iterator<output_iterator_tag, void, void, void, void>
|
||||
{
|
||||
protected:
|
||||
_Container* container;
|
||||
|
||||
public:
|
||||
/// A nested typedef for the type of whatever container you used.
|
||||
typedef _Container container_type;
|
||||
|
||||
/// The only way to create this %iterator is with a container.
|
||||
explicit
|
||||
back_insert_iterator(_Container& __x) : container(&__x) { }
|
||||
|
||||
/**
|
||||
* @param value An instance of whatever type
|
||||
* container_type::const_reference is; presumably a
|
||||
* reference-to-const T for container<T>.
|
||||
* @return This %iterator, for chained operations.
|
||||
*
|
||||
* This kind of %iterator doesn't really have a "position" in the
|
||||
* container (you can think of the position as being permanently at
|
||||
* the end, if you like). Assigning a value to the %iterator will
|
||||
* always append the value to the end of the container.
|
||||
*/
|
||||
back_insert_iterator&
|
||||
operator=(typename _Container::const_reference __value)
|
||||
{
|
||||
container->push_back(__value);
|
||||
return *this;
|
||||
}
|
||||
|
||||
/// Simply returns *this.
|
||||
back_insert_iterator&
|
||||
operator*()
|
||||
{ return *this; }
|
||||
|
||||
/// Simply returns *this. (This %iterator does not "move".)
|
||||
back_insert_iterator&
|
||||
operator++()
|
||||
{ return *this; }
|
||||
|
||||
/// Simply returns *this. (This %iterator does not "move".)
|
||||
back_insert_iterator
|
||||
operator++(int)
|
||||
{ return *this; }
|
||||
};
|
||||
|
||||
/**
|
||||
* @param x A container of arbitrary type.
|
||||
* @return An instance of back_insert_iterator working on @p x.
|
||||
*
|
||||
* This wrapper function helps in creating back_insert_iterator instances.
|
||||
* Typing the name of the %iterator requires knowing the precise full
|
||||
* type of the container, which can be tedious and impedes generic
|
||||
* programming. Using this function lets you take advantage of automatic
|
||||
* template parameter deduction, making the compiler match the correct
|
||||
* types for you.
|
||||
*/
|
||||
template<typename _Container>
|
||||
inline back_insert_iterator<_Container>
|
||||
back_inserter(_Container& __x)
|
||||
{ return back_insert_iterator<_Container>(__x); }
|
||||
|
||||
/**
|
||||
* @brief Turns assignment into insertion.
|
||||
*
|
||||
* These are output iterators, constructed from a container-of-T.
|
||||
* Assigning a T to the iterator prepends it to the container using
|
||||
* push_front.
|
||||
*
|
||||
* Tip: Using the front_inserter function to create these iterators can
|
||||
* save typing.
|
||||
*/
|
||||
template<typename _Container>
|
||||
class front_insert_iterator
|
||||
: public iterator<output_iterator_tag, void, void, void, void>
|
||||
{
|
||||
protected:
|
||||
_Container* container;
|
||||
|
||||
public:
|
||||
/// A nested typedef for the type of whatever container you used.
|
||||
typedef _Container container_type;
|
||||
|
||||
/// The only way to create this %iterator is with a container.
|
||||
explicit front_insert_iterator(_Container& __x) : container(&__x) { }
|
||||
|
||||
/**
|
||||
* @param value An instance of whatever type
|
||||
* container_type::const_reference is; presumably a
|
||||
* reference-to-const T for container<T>.
|
||||
* @return This %iterator, for chained operations.
|
||||
*
|
||||
* This kind of %iterator doesn't really have a "position" in the
|
||||
* container (you can think of the position as being permanently at
|
||||
* the front, if you like). Assigning a value to the %iterator will
|
||||
* always prepend the value to the front of the container.
|
||||
*/
|
||||
front_insert_iterator&
|
||||
operator=(typename _Container::const_reference __value)
|
||||
{
|
||||
container->push_front(__value);
|
||||
return *this;
|
||||
}
|
||||
|
||||
/// Simply returns *this.
|
||||
front_insert_iterator&
|
||||
operator*()
|
||||
{ return *this; }
|
||||
|
||||
/// Simply returns *this. (This %iterator does not "move".)
|
||||
front_insert_iterator&
|
||||
operator++()
|
||||
{ return *this; }
|
||||
|
||||
/// Simply returns *this. (This %iterator does not "move".)
|
||||
front_insert_iterator
|
||||
operator++(int)
|
||||
{ return *this; }
|
||||
};
|
||||
|
||||
/**
|
||||
* @param x A container of arbitrary type.
|
||||
* @return An instance of front_insert_iterator working on @p x.
|
||||
*
|
||||
* This wrapper function helps in creating front_insert_iterator instances.
|
||||
* Typing the name of the %iterator requires knowing the precise full
|
||||
* type of the container, which can be tedious and impedes generic
|
||||
* programming. Using this function lets you take advantage of automatic
|
||||
* template parameter deduction, making the compiler match the correct
|
||||
* types for you.
|
||||
*/
|
||||
template<typename _Container>
|
||||
inline front_insert_iterator<_Container>
|
||||
front_inserter(_Container& __x)
|
||||
{ return front_insert_iterator<_Container>(__x); }
|
||||
|
||||
/**
|
||||
* @brief Turns assignment into insertion.
|
||||
*
|
||||
* These are output iterators, constructed from a container-of-T.
|
||||
* Assigning a T to the iterator inserts it in the container at the
|
||||
* %iterator's position, rather than overwriting the value at that
|
||||
* position.
|
||||
*
|
||||
* (Sequences will actually insert a @e copy of the value before the
|
||||
* %iterator's position.)
|
||||
*
|
||||
* Tip: Using the inserter function to create these iterators can
|
||||
* save typing.
|
||||
*/
|
||||
template<typename _Container>
|
||||
class insert_iterator
|
||||
: public iterator<output_iterator_tag, void, void, void, void>
|
||||
{
|
||||
protected:
|
||||
_Container* container;
|
||||
typename _Container::iterator iter;
|
||||
|
||||
public:
|
||||
/// A nested typedef for the type of whatever container you used.
|
||||
typedef _Container container_type;
|
||||
|
||||
/**
|
||||
* The only way to create this %iterator is with a container and an
|
||||
* initial position (a normal %iterator into the container).
|
||||
*/
|
||||
insert_iterator(_Container& __x, typename _Container::iterator __i)
|
||||
: container(&__x), iter(__i) {}
|
||||
|
||||
/**
|
||||
* @param value An instance of whatever type
|
||||
* container_type::const_reference is; presumably a
|
||||
* reference-to-const T for container<T>.
|
||||
* @return This %iterator, for chained operations.
|
||||
*
|
||||
* This kind of %iterator maintains its own position in the
|
||||
* container. Assigning a value to the %iterator will insert the
|
||||
* value into the container at the place before the %iterator.
|
||||
*
|
||||
* The position is maintained such that subsequent assignments will
|
||||
* insert values immediately after one another. For example,
|
||||
* @code
|
||||
* // vector v contains A and Z
|
||||
*
|
||||
* insert_iterator i (v, ++v.begin());
|
||||
* i = 1;
|
||||
* i = 2;
|
||||
* i = 3;
|
||||
*
|
||||
* // vector v contains A, 1, 2, 3, and Z
|
||||
* @endcode
|
||||
*/
|
||||
insert_iterator&
|
||||
operator=(const typename _Container::const_reference __value)
|
||||
{
|
||||
iter = container->insert(iter, __value);
|
||||
++iter;
|
||||
return *this;
|
||||
}
|
||||
|
||||
/// Simply returns *this.
|
||||
insert_iterator&
|
||||
operator*()
|
||||
{ return *this; }
|
||||
|
||||
/// Simply returns *this. (This %iterator does not "move".)
|
||||
insert_iterator&
|
||||
operator++()
|
||||
{ return *this; }
|
||||
|
||||
/// Simply returns *this. (This %iterator does not "move".)
|
||||
insert_iterator&
|
||||
operator++(int)
|
||||
{ return *this; }
|
||||
};
|
||||
|
||||
/**
|
||||
* @param x A container of arbitrary type.
|
||||
* @return An instance of insert_iterator working on @p x.
|
||||
*
|
||||
* This wrapper function helps in creating insert_iterator instances.
|
||||
* Typing the name of the %iterator requires knowing the precise full
|
||||
* type of the container, which can be tedious and impedes generic
|
||||
* programming. Using this function lets you take advantage of automatic
|
||||
* template parameter deduction, making the compiler match the correct
|
||||
* types for you.
|
||||
*/
|
||||
template<typename _Container, typename _Iterator>
|
||||
inline insert_iterator<_Container>
|
||||
inserter(_Container& __x, _Iterator __i)
|
||||
{
|
||||
return insert_iterator<_Container>(__x,
|
||||
typename _Container::iterator(__i));
|
||||
}
|
||||
} // namespace std
|
||||
|
||||
namespace __gnu_cxx
|
||||
{
|
||||
// This iterator adapter is 'normal' in the sense that it does not
|
||||
// change the semantics of any of the operators of its iterator
|
||||
// parameter. Its primary purpose is to convert an iterator that is
|
||||
// not a class, e.g. a pointer, into an iterator that is a class.
|
||||
// The _Container parameter exists solely so that different containers
|
||||
// using this template can instantiate different types, even if the
|
||||
// _Iterator parameter is the same.
|
||||
using std::iterator_traits;
|
||||
using std::iterator;
|
||||
template<typename _Iterator, typename _Container>
|
||||
class __normal_iterator
|
||||
{
|
||||
protected:
|
||||
_Iterator _M_current;
|
||||
|
||||
public:
|
||||
typedef typename iterator_traits<_Iterator>::iterator_category
|
||||
iterator_category;
|
||||
typedef typename iterator_traits<_Iterator>::value_type value_type;
|
||||
typedef typename iterator_traits<_Iterator>::difference_type
|
||||
difference_type;
|
||||
typedef typename iterator_traits<_Iterator>::reference reference;
|
||||
typedef typename iterator_traits<_Iterator>::pointer pointer;
|
||||
|
||||
__normal_iterator() : _M_current(_Iterator()) { }
|
||||
|
||||
explicit
|
||||
__normal_iterator(const _Iterator& __i) : _M_current(__i) { }
|
||||
|
||||
// Allow iterator to const_iterator conversion
|
||||
template<typename _Iter>
|
||||
inline __normal_iterator(const __normal_iterator<_Iter,
|
||||
_Container>& __i)
|
||||
: _M_current(__i.base()) { }
|
||||
|
||||
// Forward iterator requirements
|
||||
reference
|
||||
operator*() const
|
||||
{ return *_M_current; }
|
||||
|
||||
pointer
|
||||
operator->() const
|
||||
{ return _M_current; }
|
||||
|
||||
__normal_iterator&
|
||||
operator++()
|
||||
{
|
||||
++_M_current;
|
||||
return *this;
|
||||
}
|
||||
|
||||
__normal_iterator
|
||||
operator++(int)
|
||||
{ return __normal_iterator(_M_current++); }
|
||||
|
||||
// Bidirectional iterator requirements
|
||||
__normal_iterator&
|
||||
operator--()
|
||||
{
|
||||
--_M_current;
|
||||
return *this;
|
||||
}
|
||||
|
||||
__normal_iterator
|
||||
operator--(int)
|
||||
{ return __normal_iterator(_M_current--); }
|
||||
|
||||
// Random access iterator requirements
|
||||
reference
|
||||
operator[](const difference_type& __n) const
|
||||
{ return _M_current[__n]; }
|
||||
|
||||
__normal_iterator&
|
||||
operator+=(const difference_type& __n)
|
||||
{ _M_current += __n; return *this; }
|
||||
|
||||
__normal_iterator
|
||||
operator+(const difference_type& __n) const
|
||||
{ return __normal_iterator(_M_current + __n); }
|
||||
|
||||
__normal_iterator&
|
||||
operator-=(const difference_type& __n)
|
||||
{ _M_current -= __n; return *this; }
|
||||
|
||||
__normal_iterator
|
||||
operator-(const difference_type& __n) const
|
||||
{ return __normal_iterator(_M_current - __n); }
|
||||
|
||||
const _Iterator&
|
||||
base() const
|
||||
{ return _M_current; }
|
||||
};
|
||||
|
||||
// Note: In what follows, the left- and right-hand-side iterators are
|
||||
// allowed to vary in types (conceptually in cv-qualification) so that
|
||||
// comparaison between cv-qualified and non-cv-qualified iterators be
|
||||
// valid. However, the greedy and unfriendly operators in std::rel_ops
|
||||
// will make overload resolution ambiguous (when in scope) if we don't
|
||||
// provide overloads whose operands are of the same type. Can someone
|
||||
// remind me what generic programming is about? -- Gaby
|
||||
|
||||
// Forward iterator requirements
|
||||
template<typename _IteratorL, typename _IteratorR, typename _Container>
|
||||
inline bool
|
||||
operator==(const __normal_iterator<_IteratorL, _Container>& __lhs,
|
||||
const __normal_iterator<_IteratorR, _Container>& __rhs)
|
||||
{ return __lhs.base() == __rhs.base(); }
|
||||
|
||||
template<typename _Iterator, typename _Container>
|
||||
inline bool
|
||||
operator==(const __normal_iterator<_Iterator, _Container>& __lhs,
|
||||
const __normal_iterator<_Iterator, _Container>& __rhs)
|
||||
{ return __lhs.base() == __rhs.base(); }
|
||||
|
||||
template<typename _IteratorL, typename _IteratorR, typename _Container>
|
||||
inline bool
|
||||
operator!=(const __normal_iterator<_IteratorL, _Container>& __lhs,
|
||||
const __normal_iterator<_IteratorR, _Container>& __rhs)
|
||||
{ return __lhs.base() != __rhs.base(); }
|
||||
|
||||
template<typename _Iterator, typename _Container>
|
||||
inline bool
|
||||
operator!=(const __normal_iterator<_Iterator, _Container>& __lhs,
|
||||
const __normal_iterator<_Iterator, _Container>& __rhs)
|
||||
{ return __lhs.base() != __rhs.base(); }
|
||||
|
||||
// Random access iterator requirements
|
||||
template<typename _IteratorL, typename _IteratorR, typename _Container>
|
||||
inline bool
|
||||
operator<(const __normal_iterator<_IteratorL, _Container>& __lhs,
|
||||
const __normal_iterator<_IteratorR, _Container>& __rhs)
|
||||
{ return __lhs.base() < __rhs.base(); }
|
||||
|
||||
template<typename _Iterator, typename _Container>
|
||||
inline bool
|
||||
operator<(const __normal_iterator<_Iterator, _Container>& __lhs,
|
||||
const __normal_iterator<_Iterator, _Container>& __rhs)
|
||||
{ return __lhs.base() < __rhs.base(); }
|
||||
|
||||
template<typename _IteratorL, typename _IteratorR, typename _Container>
|
||||
inline bool
|
||||
operator>(const __normal_iterator<_IteratorL, _Container>& __lhs,
|
||||
const __normal_iterator<_IteratorR, _Container>& __rhs)
|
||||
{ return __lhs.base() > __rhs.base(); }
|
||||
|
||||
template<typename _Iterator, typename _Container>
|
||||
inline bool
|
||||
operator>(const __normal_iterator<_Iterator, _Container>& __lhs,
|
||||
const __normal_iterator<_Iterator, _Container>& __rhs)
|
||||
{ return __lhs.base() > __rhs.base(); }
|
||||
|
||||
template<typename _IteratorL, typename _IteratorR, typename _Container>
|
||||
inline bool
|
||||
operator<=(const __normal_iterator<_IteratorL, _Container>& __lhs,
|
||||
const __normal_iterator<_IteratorR, _Container>& __rhs)
|
||||
{ return __lhs.base() <= __rhs.base(); }
|
||||
|
||||
template<typename _Iterator, typename _Container>
|
||||
inline bool
|
||||
operator<=(const __normal_iterator<_Iterator, _Container>& __lhs,
|
||||
const __normal_iterator<_Iterator, _Container>& __rhs)
|
||||
{ return __lhs.base() <= __rhs.base(); }
|
||||
|
||||
template<typename _IteratorL, typename _IteratorR, typename _Container>
|
||||
inline bool
|
||||
operator>=(const __normal_iterator<_IteratorL, _Container>& __lhs,
|
||||
const __normal_iterator<_IteratorR, _Container>& __rhs)
|
||||
{ return __lhs.base() >= __rhs.base(); }
|
||||
|
||||
template<typename _Iterator, typename _Container>
|
||||
inline bool
|
||||
operator>=(const __normal_iterator<_Iterator, _Container>& __lhs,
|
||||
const __normal_iterator<_Iterator, _Container>& __rhs)
|
||||
{ return __lhs.base() >= __rhs.base(); }
|
||||
|
||||
// _GLIBCXX_RESOLVE_LIB_DEFECTS
|
||||
// According to the resolution of DR179 not only the various comparison
|
||||
// operators but also operator- must accept mixed iterator/const_iterator
|
||||
// parameters.
|
||||
template<typename _IteratorL, typename _IteratorR, typename _Container>
|
||||
inline typename __normal_iterator<_IteratorL, _Container>::difference_type
|
||||
operator-(const __normal_iterator<_IteratorL, _Container>& __lhs,
|
||||
const __normal_iterator<_IteratorR, _Container>& __rhs)
|
||||
{ return __lhs.base() - __rhs.base(); }
|
||||
|
||||
template<typename _Iterator, typename _Container>
|
||||
inline __normal_iterator<_Iterator, _Container>
|
||||
operator+(typename __normal_iterator<_Iterator, _Container>::difference_type
|
||||
__n, const __normal_iterator<_Iterator, _Container>& __i)
|
||||
{ return __normal_iterator<_Iterator, _Container>(__i.base() + __n); }
|
||||
} // namespace __gnu_cxx
|
||||
|
||||
#endif
|
||||
|
||||
// Local Variables:
|
||||
// mode:C++
|
||||
// End:
|
||||
@ -0,0 +1,179 @@
|
||||
// Functions used by iterators -*- C++ -*-
|
||||
|
||||
// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 2, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING. If not, write to the Free
|
||||
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
// USA.
|
||||
|
||||
// As a special exception, you may use this file as part of a free software
|
||||
// library without restriction. Specifically, if other files instantiate
|
||||
// templates or use macros or inline functions from this file, or you compile
|
||||
// this file and link it with other files to produce an executable, this
|
||||
// file does not by itself cause the resulting executable to be covered by
|
||||
// the GNU General Public License. This exception does not however
|
||||
// invalidate any other reasons why the executable file might be covered by
|
||||
// the GNU General Public License.
|
||||
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 1994
|
||||
* Hewlett-Packard Company
|
||||
*
|
||||
* Permission to use, copy, modify, distribute and sell this software
|
||||
* and its documentation for any purpose is hereby granted without fee,
|
||||
* provided that the above copyright notice appear in all copies and
|
||||
* that both that copyright notice and this permission notice appear
|
||||
* in supporting documentation. Hewlett-Packard Company makes no
|
||||
* representations about the suitability of this software for any
|
||||
* purpose. It is provided "as is" without express or implied warranty.
|
||||
*
|
||||
*
|
||||
* Copyright (c) 1996-1998
|
||||
* Silicon Graphics Computer Systems, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, distribute and sell this software
|
||||
* and its documentation for any purpose is hereby granted without fee,
|
||||
* provided that the above copyright notice appear in all copies and
|
||||
* that both that copyright notice and this permission notice appear
|
||||
* in supporting documentation. Silicon Graphics makes no
|
||||
* representations about the suitability of this software for any
|
||||
* purpose. It is provided "as is" without express or implied warranty.
|
||||
*/
|
||||
|
||||
/** @file stl_iterator_base_funcs.h
|
||||
* This is an internal header file, included by other library headers.
|
||||
* You should not attempt to use it directly.
|
||||
*
|
||||
* This file contains all of the general iterator-related utility
|
||||
* functions, such as distance() and advance().
|
||||
*/
|
||||
|
||||
#ifndef _ITERATOR_BASE_FUNCS_H
|
||||
#define _ITERATOR_BASE_FUNCS_H 1
|
||||
|
||||
#pragma GCC system_header
|
||||
#include <bits/concept_check.h>
|
||||
|
||||
namespace std
|
||||
{
|
||||
template<typename _InputIterator>
|
||||
inline typename iterator_traits<_InputIterator>::difference_type
|
||||
__distance(_InputIterator __first, _InputIterator __last,
|
||||
input_iterator_tag)
|
||||
{
|
||||
// concept requirements
|
||||
__glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
|
||||
|
||||
typename iterator_traits<_InputIterator>::difference_type __n = 0;
|
||||
while (__first != __last)
|
||||
{
|
||||
++__first;
|
||||
++__n;
|
||||
}
|
||||
return __n;
|
||||
}
|
||||
|
||||
template<typename _RandomAccessIterator>
|
||||
inline typename iterator_traits<_RandomAccessIterator>::difference_type
|
||||
__distance(_RandomAccessIterator __first, _RandomAccessIterator __last,
|
||||
random_access_iterator_tag)
|
||||
{
|
||||
// concept requirements
|
||||
__glibcxx_function_requires(_RandomAccessIteratorConcept<
|
||||
_RandomAccessIterator>)
|
||||
return __last - __first;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief A generalization of pointer arithmetic.
|
||||
* @param first An input iterator.
|
||||
* @param last An input iterator.
|
||||
* @return The distance between them.
|
||||
*
|
||||
* Returns @c n such that first + n == last. This requires that @p last
|
||||
* must be reachable from @p first. Note that @c n may be negative.
|
||||
*
|
||||
* For random access iterators, this uses their @c + and @c - operations
|
||||
* and are constant time. For other %iterator classes they are linear time.
|
||||
*/
|
||||
template<typename _InputIterator>
|
||||
inline typename iterator_traits<_InputIterator>::difference_type
|
||||
distance(_InputIterator __first, _InputIterator __last)
|
||||
{
|
||||
// concept requirements -- taken care of in __distance
|
||||
return std::__distance(__first, __last,
|
||||
std::__iterator_category(__first));
|
||||
}
|
||||
|
||||
template<typename _InputIterator, typename _Distance>
|
||||
inline void
|
||||
__advance(_InputIterator& __i, _Distance __n, input_iterator_tag)
|
||||
{
|
||||
// concept requirements
|
||||
__glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
|
||||
while (__n--)
|
||||
++__i;
|
||||
}
|
||||
|
||||
template<typename _BidirectionalIterator, typename _Distance>
|
||||
inline void
|
||||
__advance(_BidirectionalIterator& __i, _Distance __n,
|
||||
bidirectional_iterator_tag)
|
||||
{
|
||||
// concept requirements
|
||||
__glibcxx_function_requires(_BidirectionalIteratorConcept<
|
||||
_BidirectionalIterator>)
|
||||
if (__n > 0)
|
||||
while (__n--)
|
||||
++__i;
|
||||
else
|
||||
while (__n++)
|
||||
--__i;
|
||||
}
|
||||
|
||||
template<typename _RandomAccessIterator, typename _Distance>
|
||||
inline void
|
||||
__advance(_RandomAccessIterator& __i, _Distance __n,
|
||||
random_access_iterator_tag)
|
||||
{
|
||||
// concept requirements
|
||||
__glibcxx_function_requires(_RandomAccessIteratorConcept<
|
||||
_RandomAccessIterator>)
|
||||
__i += __n;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief A generalization of pointer arithmetic.
|
||||
* @param i An input iterator.
|
||||
* @param n The "delta" by which to change @p i.
|
||||
* @return Nothing.
|
||||
*
|
||||
* This increments @p i by @p n. For bidirectional and random access
|
||||
* iterators, @p n may be negative, in which case @p i is decremented.
|
||||
*
|
||||
* For random access iterators, this uses their @c + and @c - operations
|
||||
* and are constant time. For other %iterator classes they are linear time.
|
||||
*/
|
||||
template<typename _InputIterator, typename _Distance>
|
||||
inline void
|
||||
advance(_InputIterator& __i, _Distance __n)
|
||||
{
|
||||
// concept requirements -- taken care of in __advance
|
||||
std::__advance(__i, __n, std::__iterator_category(__i));
|
||||
}
|
||||
} // namespace std
|
||||
|
||||
#endif /* _ITERATOR_BASE_FUNCS_H */
|
||||
@ -0,0 +1,170 @@
|
||||
// Types used in iterator implementation -*- C++ -*-
|
||||
|
||||
// Copyright (C) 2001, 2002, 2004 Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 2, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING. If not, write to the Free
|
||||
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
// USA.
|
||||
|
||||
// As a special exception, you may use this file as part of a free software
|
||||
// library without restriction. Specifically, if other files instantiate
|
||||
// templates or use macros or inline functions from this file, or you compile
|
||||
// this file and link it with other files to produce an executable, this
|
||||
// file does not by itself cause the resulting executable to be covered by
|
||||
// the GNU General Public License. This exception does not however
|
||||
// invalidate any other reasons why the executable file might be covered by
|
||||
// the GNU General Public License.
|
||||
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 1994
|
||||
* Hewlett-Packard Company
|
||||
*
|
||||
* Permission to use, copy, modify, distribute and sell this software
|
||||
* and its documentation for any purpose is hereby granted without fee,
|
||||
* provided that the above copyright notice appear in all copies and
|
||||
* that both that copyright notice and this permission notice appear
|
||||
* in supporting documentation. Hewlett-Packard Company makes no
|
||||
* representations about the suitability of this software for any
|
||||
* purpose. It is provided "as is" without express or implied warranty.
|
||||
*
|
||||
*
|
||||
* Copyright (c) 1996-1998
|
||||
* Silicon Graphics Computer Systems, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, distribute and sell this software
|
||||
* and its documentation for any purpose is hereby granted without fee,
|
||||
* provided that the above copyright notice appear in all copies and
|
||||
* that both that copyright notice and this permission notice appear
|
||||
* in supporting documentation. Silicon Graphics makes no
|
||||
* representations about the suitability of this software for any
|
||||
* purpose. It is provided "as is" without express or implied warranty.
|
||||
*/
|
||||
|
||||
/** @file stl_iterator_base_types.h
|
||||
* This is an internal header file, included by other library headers.
|
||||
* You should not attempt to use it directly.
|
||||
*
|
||||
* This file contains all of the general iterator-related utility types,
|
||||
* such as iterator_traits and struct iterator.
|
||||
*/
|
||||
|
||||
#ifndef _ITERATOR_BASE_TYPES_H
|
||||
#define _ITERATOR_BASE_TYPES_H 1
|
||||
|
||||
#pragma GCC system_header
|
||||
|
||||
namespace std
|
||||
{
|
||||
//@{
|
||||
/**
|
||||
* @defgroup iterator_tags Iterator Tags
|
||||
* These are empty types, used to distinguish different iterators. The
|
||||
* distinction is not made by what they contain, but simply by what they
|
||||
* are. Different underlying algorithms can then be used based on the
|
||||
* different operations supporetd by different iterator types.
|
||||
*/
|
||||
/// Marking input iterators.
|
||||
struct input_iterator_tag {};
|
||||
/// Marking output iterators.
|
||||
struct output_iterator_tag {};
|
||||
/// Forward iterators support a superset of input iterator operations.
|
||||
struct forward_iterator_tag : public input_iterator_tag {};
|
||||
/// Bidirectional iterators support a superset of forward iterator
|
||||
/// operations.
|
||||
struct bidirectional_iterator_tag : public forward_iterator_tag {};
|
||||
/// Random-access iterators support a superset of bidirectional iterator
|
||||
/// operations.
|
||||
struct random_access_iterator_tag : public bidirectional_iterator_tag {};
|
||||
//@}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Common %iterator class.
|
||||
*
|
||||
* This class does nothing but define nested typedefs. %Iterator classes
|
||||
* can inherit from this class to save some work. The typedefs are then
|
||||
* used in specializations and overloading.
|
||||
*
|
||||
* In particular, there are no default implementations of requirements
|
||||
* such as @c operator++ and the like. (How could there be?)
|
||||
*/
|
||||
template<typename _Category, typename _Tp, typename _Distance = ptrdiff_t,
|
||||
typename _Pointer = _Tp*, typename _Reference = _Tp&>
|
||||
struct iterator
|
||||
{
|
||||
/// One of the @link iterator_tags tag types@endlink.
|
||||
typedef _Category iterator_category;
|
||||
/// The type "pointed to" by the iterator.
|
||||
typedef _Tp value_type;
|
||||
/// Distance between iterators is represented as this type.
|
||||
typedef _Distance difference_type;
|
||||
/// This type represents a pointer-to-value_type.
|
||||
typedef _Pointer pointer;
|
||||
/// This type represents a reference-to-value_type.
|
||||
typedef _Reference reference;
|
||||
};
|
||||
|
||||
/**
|
||||
* This class does nothing but define nested typedefs. The general
|
||||
* version simply "forwards" the nested typedefs from the Iterator
|
||||
* argument. Specialized versions for pointers and pointers-to-const
|
||||
* provide tighter, more correct semantics.
|
||||
*/
|
||||
template<typename _Iterator>
|
||||
struct iterator_traits
|
||||
{
|
||||
typedef typename _Iterator::iterator_category iterator_category;
|
||||
typedef typename _Iterator::value_type value_type;
|
||||
typedef typename _Iterator::difference_type difference_type;
|
||||
typedef typename _Iterator::pointer pointer;
|
||||
typedef typename _Iterator::reference reference;
|
||||
};
|
||||
|
||||
template<typename _Tp>
|
||||
struct iterator_traits<_Tp*>
|
||||
{
|
||||
typedef random_access_iterator_tag iterator_category;
|
||||
typedef _Tp value_type;
|
||||
typedef ptrdiff_t difference_type;
|
||||
typedef _Tp* pointer;
|
||||
typedef _Tp& reference;
|
||||
};
|
||||
|
||||
template<typename _Tp>
|
||||
struct iterator_traits<const _Tp*>
|
||||
{
|
||||
typedef random_access_iterator_tag iterator_category;
|
||||
typedef _Tp value_type;
|
||||
typedef ptrdiff_t difference_type;
|
||||
typedef const _Tp* pointer;
|
||||
typedef const _Tp& reference;
|
||||
};
|
||||
|
||||
/**
|
||||
* @if maint
|
||||
* This function is not a part of the C++ standard but is syntactic
|
||||
* sugar for internal library use only.
|
||||
* @endif
|
||||
*/
|
||||
template<typename _Iter>
|
||||
inline typename iterator_traits<_Iter>::iterator_category
|
||||
__iterator_category(const _Iter&)
|
||||
{ return typename iterator_traits<_Iter>::iterator_category(); }
|
||||
|
||||
} // namespace std
|
||||
|
||||
#endif /* _ITERATOR_BASE_TYPES_H */
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,694 @@
|
||||
// Map implementation -*- C++ -*-
|
||||
|
||||
// Copyright (C) 2001, 2002, 2004 Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 2, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING. If not, write to the Free
|
||||
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
// USA.
|
||||
|
||||
// As a special exception, you may use this file as part of a free software
|
||||
// library without restriction. Specifically, if other files instantiate
|
||||
// templates or use macros or inline functions from this file, or you compile
|
||||
// this file and link it with other files to produce an executable, this
|
||||
// file does not by itself cause the resulting executable to be covered by
|
||||
// the GNU General Public License. This exception does not however
|
||||
// invalidate any other reasons why the executable file might be covered by
|
||||
// the GNU General Public License.
|
||||
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 1994
|
||||
* Hewlett-Packard Company
|
||||
*
|
||||
* Permission to use, copy, modify, distribute and sell this software
|
||||
* and its documentation for any purpose is hereby granted without fee,
|
||||
* provided that the above copyright notice appear in all copies and
|
||||
* that both that copyright notice and this permission notice appear
|
||||
* in supporting documentation. Hewlett-Packard Company makes no
|
||||
* representations about the suitability of this software for any
|
||||
* purpose. It is provided "as is" without express or implied warranty.
|
||||
*
|
||||
*
|
||||
* Copyright (c) 1996,1997
|
||||
* Silicon Graphics Computer Systems, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, distribute and sell this software
|
||||
* and its documentation for any purpose is hereby granted without fee,
|
||||
* provided that the above copyright notice appear in all copies and
|
||||
* that both that copyright notice and this permission notice appear
|
||||
* in supporting documentation. Silicon Graphics makes no
|
||||
* representations about the suitability of this software for any
|
||||
* purpose. It is provided "as is" without express or implied warranty.
|
||||
*/
|
||||
|
||||
/** @file stl_map.h
|
||||
* This is an internal header file, included by other library headers.
|
||||
* You should not attempt to use it directly.
|
||||
*/
|
||||
|
||||
#ifndef _MAP_H
|
||||
#define _MAP_H 1
|
||||
|
||||
#include <bits/concept_check.h>
|
||||
|
||||
namespace _GLIBCXX_STD
|
||||
{
|
||||
/**
|
||||
* @brief A standard container made up of (key,value) pairs, which can be
|
||||
* retrieved based on a key, in logarithmic time.
|
||||
*
|
||||
* @ingroup Containers
|
||||
* @ingroup Assoc_containers
|
||||
*
|
||||
* Meets the requirements of a <a href="tables.html#65">container</a>, a
|
||||
* <a href="tables.html#66">reversible container</a>, and an
|
||||
* <a href="tables.html#69">associative container</a> (using unique keys).
|
||||
* For a @c map<Key,T> the key_type is Key, the mapped_type is T, and the
|
||||
* value_type is std::pair<const Key,T>.
|
||||
*
|
||||
* Maps support bidirectional iterators.
|
||||
*
|
||||
* @if maint
|
||||
* The private tree data is declared exactly the same way for map and
|
||||
* multimap; the distinction is made entirely in how the tree functions are
|
||||
* called (*_unique versus *_equal, same as the standard).
|
||||
* @endif
|
||||
*/
|
||||
template <typename _Key, typename _Tp, typename _Compare = less<_Key>,
|
||||
typename _Alloc = allocator<pair<const _Key, _Tp> > >
|
||||
class map
|
||||
{
|
||||
// concept requirements
|
||||
__glibcxx_class_requires(_Tp, _SGIAssignableConcept)
|
||||
__glibcxx_class_requires4(_Compare, bool, _Key, _Key,
|
||||
_BinaryFunctionConcept)
|
||||
|
||||
public:
|
||||
typedef _Key key_type;
|
||||
typedef _Tp mapped_type;
|
||||
typedef pair<const _Key, _Tp> value_type;
|
||||
typedef _Compare key_compare;
|
||||
|
||||
class value_compare
|
||||
: public binary_function<value_type, value_type, bool>
|
||||
{
|
||||
friend class map<_Key,_Tp,_Compare,_Alloc>;
|
||||
protected:
|
||||
_Compare comp;
|
||||
|
||||
value_compare(_Compare __c)
|
||||
: comp(__c) { }
|
||||
|
||||
public:
|
||||
bool operator()(const value_type& __x, const value_type& __y) const
|
||||
{ return comp(__x.first, __y.first); }
|
||||
};
|
||||
|
||||
private:
|
||||
/// @if maint This turns a red-black tree into a [multi]map. @endif
|
||||
typedef _Rb_tree<key_type, value_type,
|
||||
_Select1st<value_type>, key_compare, _Alloc> _Rep_type;
|
||||
/// @if maint The actual tree structure. @endif
|
||||
_Rep_type _M_t;
|
||||
|
||||
public:
|
||||
// many of these are specified differently in ISO, but the following are
|
||||
// "functionally equivalent"
|
||||
typedef typename _Rep_type::allocator_type allocator_type;
|
||||
typedef typename _Rep_type::reference reference;
|
||||
typedef typename _Rep_type::const_reference const_reference;
|
||||
typedef typename _Rep_type::iterator iterator;
|
||||
typedef typename _Rep_type::const_iterator const_iterator;
|
||||
typedef typename _Rep_type::size_type size_type;
|
||||
typedef typename _Rep_type::difference_type difference_type;
|
||||
typedef typename _Rep_type::pointer pointer;
|
||||
typedef typename _Rep_type::const_pointer const_pointer;
|
||||
typedef typename _Rep_type::reverse_iterator reverse_iterator;
|
||||
typedef typename _Rep_type::const_reverse_iterator const_reverse_iterator;
|
||||
|
||||
// [23.3.1.1] construct/copy/destroy
|
||||
// (get_allocator() is normally listed in this section, but seems to have
|
||||
// been accidentally omitted in the printed standard)
|
||||
/**
|
||||
* @brief Default constructor creates no elements.
|
||||
*/
|
||||
map()
|
||||
: _M_t(_Compare(), allocator_type()) { }
|
||||
|
||||
// for some reason this was made a separate function
|
||||
/**
|
||||
* @brief Default constructor creates no elements.
|
||||
*/
|
||||
explicit
|
||||
map(const _Compare& __comp, const allocator_type& __a = allocator_type())
|
||||
: _M_t(__comp, __a) { }
|
||||
|
||||
/**
|
||||
* @brief Map copy constructor.
|
||||
* @param x A %map of identical element and allocator types.
|
||||
*
|
||||
* The newly-created %map uses a copy of the allocation object used
|
||||
* by @a x.
|
||||
*/
|
||||
map(const map& __x)
|
||||
: _M_t(__x._M_t) { }
|
||||
|
||||
/**
|
||||
* @brief Builds a %map from a range.
|
||||
* @param first An input iterator.
|
||||
* @param last An input iterator.
|
||||
*
|
||||
* Create a %map consisting of copies of the elements from [first,last).
|
||||
* This is linear in N if the range is already sorted, and NlogN
|
||||
* otherwise (where N is distance(first,last)).
|
||||
*/
|
||||
template <typename _InputIterator>
|
||||
map(_InputIterator __first, _InputIterator __last)
|
||||
: _M_t(_Compare(), allocator_type())
|
||||
{ _M_t.insert_unique(__first, __last); }
|
||||
|
||||
/**
|
||||
* @brief Builds a %map from a range.
|
||||
* @param first An input iterator.
|
||||
* @param last An input iterator.
|
||||
* @param comp A comparison functor.
|
||||
* @param a An allocator object.
|
||||
*
|
||||
* Create a %map consisting of copies of the elements from [first,last).
|
||||
* This is linear in N if the range is already sorted, and NlogN
|
||||
* otherwise (where N is distance(first,last)).
|
||||
*/
|
||||
template <typename _InputIterator>
|
||||
map(_InputIterator __first, _InputIterator __last,
|
||||
const _Compare& __comp, const allocator_type& __a = allocator_type())
|
||||
: _M_t(__comp, __a)
|
||||
{ _M_t.insert_unique(__first, __last); }
|
||||
|
||||
// FIXME There is no dtor declared, but we should have something generated
|
||||
// by Doxygen. I don't know what tags to add to this paragraph to make
|
||||
// that happen:
|
||||
/**
|
||||
* The dtor only erases the elements, and note that if the elements
|
||||
* themselves are pointers, the pointed-to memory is not touched in any
|
||||
* way. Managing the pointer is the user's responsibilty.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @brief Map assignment operator.
|
||||
* @param x A %map of identical element and allocator types.
|
||||
*
|
||||
* All the elements of @a x are copied, but unlike the copy constructor,
|
||||
* the allocator object is not copied.
|
||||
*/
|
||||
map&
|
||||
operator=(const map& __x)
|
||||
{
|
||||
_M_t = __x._M_t;
|
||||
return *this;
|
||||
}
|
||||
|
||||
/// Get a copy of the memory allocation object.
|
||||
allocator_type
|
||||
get_allocator() const
|
||||
{ return _M_t.get_allocator(); }
|
||||
|
||||
// iterators
|
||||
/**
|
||||
* Returns a read/write iterator that points to the first pair in the
|
||||
* %map.
|
||||
* Iteration is done in ascending order according to the keys.
|
||||
*/
|
||||
iterator
|
||||
begin()
|
||||
{ return _M_t.begin(); }
|
||||
|
||||
/**
|
||||
* Returns a read-only (constant) iterator that points to the first pair
|
||||
* in the %map. Iteration is done in ascending order according to the
|
||||
* keys.
|
||||
*/
|
||||
const_iterator
|
||||
begin() const
|
||||
{ return _M_t.begin(); }
|
||||
|
||||
/**
|
||||
* Returns a read/write iterator that points one past the last pair in
|
||||
* the %map. Iteration is done in ascending order according to the keys.
|
||||
*/
|
||||
iterator
|
||||
end()
|
||||
{ return _M_t.end(); }
|
||||
|
||||
/**
|
||||
* Returns a read-only (constant) iterator that points one past the last
|
||||
* pair in the %map. Iteration is done in ascending order according to
|
||||
* the keys.
|
||||
*/
|
||||
const_iterator
|
||||
end() const
|
||||
{ return _M_t.end(); }
|
||||
|
||||
/**
|
||||
* Returns a read/write reverse iterator that points to the last pair in
|
||||
* the %map. Iteration is done in descending order according to the
|
||||
* keys.
|
||||
*/
|
||||
reverse_iterator
|
||||
rbegin()
|
||||
{ return _M_t.rbegin(); }
|
||||
|
||||
/**
|
||||
* Returns a read-only (constant) reverse iterator that points to the
|
||||
* last pair in the %map. Iteration is done in descending order
|
||||
* according to the keys.
|
||||
*/
|
||||
const_reverse_iterator
|
||||
rbegin() const
|
||||
{ return _M_t.rbegin(); }
|
||||
|
||||
/**
|
||||
* Returns a read/write reverse iterator that points to one before the
|
||||
* first pair in the %map. Iteration is done in descending order
|
||||
* according to the keys.
|
||||
*/
|
||||
reverse_iterator
|
||||
rend()
|
||||
{ return _M_t.rend(); }
|
||||
|
||||
/**
|
||||
* Returns a read-only (constant) reverse iterator that points to one
|
||||
* before the first pair in the %map. Iteration is done in descending
|
||||
* order according to the keys.
|
||||
*/
|
||||
const_reverse_iterator
|
||||
rend() const
|
||||
{ return _M_t.rend(); }
|
||||
|
||||
// capacity
|
||||
/** Returns true if the %map is empty. (Thus begin() would equal
|
||||
* end().)
|
||||
*/
|
||||
bool
|
||||
empty() const
|
||||
{ return _M_t.empty(); }
|
||||
|
||||
/** Returns the size of the %map. */
|
||||
size_type
|
||||
size() const
|
||||
{ return _M_t.size(); }
|
||||
|
||||
/** Returns the maximum size of the %map. */
|
||||
size_type
|
||||
max_size() const
|
||||
{ return _M_t.max_size(); }
|
||||
|
||||
// [23.3.1.2] element access
|
||||
/**
|
||||
* @brief Subscript ( @c [] ) access to %map data.
|
||||
* @param k The key for which data should be retrieved.
|
||||
* @return A reference to the data of the (key,data) %pair.
|
||||
*
|
||||
* Allows for easy lookup with the subscript ( @c [] ) operator. Returns
|
||||
* data associated with the key specified in subscript. If the key does
|
||||
* not exist, a pair with that key is created using default values, which
|
||||
* is then returned.
|
||||
*
|
||||
* Lookup requires logarithmic time.
|
||||
*/
|
||||
mapped_type&
|
||||
operator[](const key_type& __k)
|
||||
{
|
||||
// concept requirements
|
||||
__glibcxx_function_requires(_DefaultConstructibleConcept<mapped_type>)
|
||||
|
||||
iterator __i = lower_bound(__k);
|
||||
// __i->first is greater than or equivalent to __k.
|
||||
if (__i == end() || key_comp()(__k, (*__i).first))
|
||||
__i = insert(__i, value_type(__k, mapped_type()));
|
||||
return (*__i).second;
|
||||
}
|
||||
|
||||
// modifiers
|
||||
/**
|
||||
* @brief Attempts to insert a std::pair into the %map.
|
||||
* @param x Pair to be inserted (see std::make_pair for easy creation of
|
||||
* pairs).
|
||||
* @return A pair, of which the first element is an iterator that points
|
||||
* to the possibly inserted pair, and the second is a bool that
|
||||
* is true if the pair was actually inserted.
|
||||
*
|
||||
* This function attempts to insert a (key, value) %pair into the %map.
|
||||
* A %map relies on unique keys and thus a %pair is only inserted if its
|
||||
* first element (the key) is not already present in the %map.
|
||||
*
|
||||
* Insertion requires logarithmic time.
|
||||
*/
|
||||
pair<iterator,bool>
|
||||
insert(const value_type& __x)
|
||||
{ return _M_t.insert_unique(__x); }
|
||||
|
||||
/**
|
||||
* @brief Attempts to insert a std::pair into the %map.
|
||||
* @param position An iterator that serves as a hint as to where the
|
||||
* pair should be inserted.
|
||||
* @param x Pair to be inserted (see std::make_pair for easy creation of
|
||||
* pairs).
|
||||
* @return An iterator that points to the element with key of @a x (may
|
||||
* or may not be the %pair passed in).
|
||||
*
|
||||
* This function is not concerned about whether the insertion took place,
|
||||
* and thus does not return a boolean like the single-argument
|
||||
* insert() does. Note that the first parameter is only a hint and can
|
||||
* potentially improve the performance of the insertion process. A bad
|
||||
* hint would cause no gains in efficiency.
|
||||
*
|
||||
* See http://gcc.gnu.org/onlinedocs/libstdc++/23_containers/howto.html#4
|
||||
* for more on "hinting".
|
||||
*
|
||||
* Insertion requires logarithmic time (if the hint is not taken).
|
||||
*/
|
||||
iterator
|
||||
insert(iterator position, const value_type& __x)
|
||||
{ return _M_t.insert_unique(position, __x); }
|
||||
|
||||
/**
|
||||
* @brief A template function that attemps to insert a range of elements.
|
||||
* @param first Iterator pointing to the start of the range to be
|
||||
* inserted.
|
||||
* @param last Iterator pointing to the end of the range.
|
||||
*
|
||||
* Complexity similar to that of the range constructor.
|
||||
*/
|
||||
template <typename _InputIterator>
|
||||
void
|
||||
insert(_InputIterator __first, _InputIterator __last)
|
||||
{ _M_t.insert_unique(__first, __last); }
|
||||
|
||||
/**
|
||||
* @brief Erases an element from a %map.
|
||||
* @param position An iterator pointing to the element to be erased.
|
||||
*
|
||||
* This function erases an element, pointed to by the given iterator,
|
||||
* from a %map. Note that this function only erases the element, and
|
||||
* that if the element is itself a pointer, the pointed-to memory is not
|
||||
* touched in any way. Managing the pointer is the user's responsibilty.
|
||||
*/
|
||||
void
|
||||
erase(iterator __position)
|
||||
{ _M_t.erase(__position); }
|
||||
|
||||
/**
|
||||
* @brief Erases elements according to the provided key.
|
||||
* @param x Key of element to be erased.
|
||||
* @return The number of elements erased.
|
||||
*
|
||||
* This function erases all the elements located by the given key from
|
||||
* a %map.
|
||||
* Note that this function only erases the element, and that if
|
||||
* the element is itself a pointer, the pointed-to memory is not touched
|
||||
* in any way. Managing the pointer is the user's responsibilty.
|
||||
*/
|
||||
size_type
|
||||
erase(const key_type& __x)
|
||||
{ return _M_t.erase(__x); }
|
||||
|
||||
/**
|
||||
* @brief Erases a [first,last) range of elements from a %map.
|
||||
* @param first Iterator pointing to the start of the range to be
|
||||
* erased.
|
||||
* @param last Iterator pointing to the end of the range to be erased.
|
||||
*
|
||||
* This function erases a sequence of elements from a %map.
|
||||
* Note that this function only erases the element, and that if
|
||||
* the element is itself a pointer, the pointed-to memory is not touched
|
||||
* in any way. Managing the pointer is the user's responsibilty.
|
||||
*/
|
||||
void
|
||||
erase(iterator __first, iterator __last)
|
||||
{ _M_t.erase(__first, __last); }
|
||||
|
||||
/**
|
||||
* @brief Swaps data with another %map.
|
||||
* @param x A %map of the same element and allocator types.
|
||||
*
|
||||
* This exchanges the elements between two maps in constant time.
|
||||
* (It is only swapping a pointer, an integer, and an instance of
|
||||
* the @c Compare type (which itself is often stateless and empty), so it
|
||||
* should be quite fast.)
|
||||
* Note that the global std::swap() function is specialized such that
|
||||
* std::swap(m1,m2) will feed to this function.
|
||||
*/
|
||||
void
|
||||
swap(map& __x)
|
||||
{ _M_t.swap(__x._M_t); }
|
||||
|
||||
/**
|
||||
* Erases all elements in a %map. Note that this function only erases
|
||||
* the elements, and that if the elements themselves are pointers, the
|
||||
* pointed-to memory is not touched in any way. Managing the pointer is
|
||||
* the user's responsibilty.
|
||||
*/
|
||||
void
|
||||
clear()
|
||||
{ _M_t.clear(); }
|
||||
|
||||
// observers
|
||||
/**
|
||||
* Returns the key comparison object out of which the %map was
|
||||
* constructed.
|
||||
*/
|
||||
key_compare
|
||||
key_comp() const
|
||||
{ return _M_t.key_comp(); }
|
||||
|
||||
/**
|
||||
* Returns a value comparison object, built from the key comparison
|
||||
* object out of which the %map was constructed.
|
||||
*/
|
||||
value_compare
|
||||
value_comp() const
|
||||
{ return value_compare(_M_t.key_comp()); }
|
||||
|
||||
// [23.3.1.3] map operations
|
||||
/**
|
||||
* @brief Tries to locate an element in a %map.
|
||||
* @param x Key of (key, value) %pair to be located.
|
||||
* @return Iterator pointing to sought-after element, or end() if not
|
||||
* found.
|
||||
*
|
||||
* This function takes a key and tries to locate the element with which
|
||||
* the key matches. If successful the function returns an iterator
|
||||
* pointing to the sought after %pair. If unsuccessful it returns the
|
||||
* past-the-end ( @c end() ) iterator.
|
||||
*/
|
||||
iterator
|
||||
find(const key_type& __x)
|
||||
{ return _M_t.find(__x); }
|
||||
|
||||
/**
|
||||
* @brief Tries to locate an element in a %map.
|
||||
* @param x Key of (key, value) %pair to be located.
|
||||
* @return Read-only (constant) iterator pointing to sought-after
|
||||
* element, or end() if not found.
|
||||
*
|
||||
* This function takes a key and tries to locate the element with which
|
||||
* the key matches. If successful the function returns a constant
|
||||
* iterator pointing to the sought after %pair. If unsuccessful it
|
||||
* returns the past-the-end ( @c end() ) iterator.
|
||||
*/
|
||||
const_iterator
|
||||
find(const key_type& __x) const
|
||||
{ return _M_t.find(__x); }
|
||||
|
||||
/**
|
||||
* @brief Finds the number of elements with given key.
|
||||
* @param x Key of (key, value) pairs to be located.
|
||||
* @return Number of elements with specified key.
|
||||
*
|
||||
* This function only makes sense for multimaps; for map the result will
|
||||
* either be 0 (not present) or 1 (present).
|
||||
*/
|
||||
size_type
|
||||
count(const key_type& __x) const
|
||||
{ return _M_t.find(__x) == _M_t.end() ? 0 : 1; }
|
||||
|
||||
/**
|
||||
* @brief Finds the beginning of a subsequence matching given key.
|
||||
* @param x Key of (key, value) pair to be located.
|
||||
* @return Iterator pointing to first element equal to or greater
|
||||
* than key, or end().
|
||||
*
|
||||
* This function returns the first element of a subsequence of elements
|
||||
* that matches the given key. If unsuccessful it returns an iterator
|
||||
* pointing to the first element that has a greater value than given key
|
||||
* or end() if no such element exists.
|
||||
*/
|
||||
iterator
|
||||
lower_bound(const key_type& __x)
|
||||
{ return _M_t.lower_bound(__x); }
|
||||
|
||||
/**
|
||||
* @brief Finds the beginning of a subsequence matching given key.
|
||||
* @param x Key of (key, value) pair to be located.
|
||||
* @return Read-only (constant) iterator pointing to first element
|
||||
* equal to or greater than key, or end().
|
||||
*
|
||||
* This function returns the first element of a subsequence of elements
|
||||
* that matches the given key. If unsuccessful it returns an iterator
|
||||
* pointing to the first element that has a greater value than given key
|
||||
* or end() if no such element exists.
|
||||
*/
|
||||
const_iterator
|
||||
lower_bound(const key_type& __x) const
|
||||
{ return _M_t.lower_bound(__x); }
|
||||
|
||||
/**
|
||||
* @brief Finds the end of a subsequence matching given key.
|
||||
* @param x Key of (key, value) pair to be located.
|
||||
* @return Iterator pointing to the first element
|
||||
* greater than key, or end().
|
||||
*/
|
||||
iterator
|
||||
upper_bound(const key_type& __x)
|
||||
{ return _M_t.upper_bound(__x); }
|
||||
|
||||
/**
|
||||
* @brief Finds the end of a subsequence matching given key.
|
||||
* @param x Key of (key, value) pair to be located.
|
||||
* @return Read-only (constant) iterator pointing to first iterator
|
||||
* greater than key, or end().
|
||||
*/
|
||||
const_iterator
|
||||
upper_bound(const key_type& __x) const
|
||||
{ return _M_t.upper_bound(__x); }
|
||||
|
||||
/**
|
||||
* @brief Finds a subsequence matching given key.
|
||||
* @param x Key of (key, value) pairs to be located.
|
||||
* @return Pair of iterators that possibly points to the subsequence
|
||||
* matching given key.
|
||||
*
|
||||
* This function is equivalent to
|
||||
* @code
|
||||
* std::make_pair(c.lower_bound(val),
|
||||
* c.upper_bound(val))
|
||||
* @endcode
|
||||
* (but is faster than making the calls separately).
|
||||
*
|
||||
* This function probably only makes sense for multimaps.
|
||||
*/
|
||||
pair<iterator,iterator>
|
||||
equal_range(const key_type& __x)
|
||||
{ return _M_t.equal_range(__x); }
|
||||
|
||||
/**
|
||||
* @brief Finds a subsequence matching given key.
|
||||
* @param x Key of (key, value) pairs to be located.
|
||||
* @return Pair of read-only (constant) iterators that possibly points
|
||||
* to the subsequence matching given key.
|
||||
*
|
||||
* This function is equivalent to
|
||||
* @code
|
||||
* std::make_pair(c.lower_bound(val),
|
||||
* c.upper_bound(val))
|
||||
* @endcode
|
||||
* (but is faster than making the calls separately).
|
||||
*
|
||||
* This function probably only makes sense for multimaps.
|
||||
*/
|
||||
pair<const_iterator,const_iterator>
|
||||
equal_range(const key_type& __x) const
|
||||
{ return _M_t.equal_range(__x); }
|
||||
|
||||
template <typename _K1, typename _T1, typename _C1, typename _A1>
|
||||
friend bool
|
||||
operator== (const map<_K1,_T1,_C1,_A1>&,
|
||||
const map<_K1,_T1,_C1,_A1>&);
|
||||
|
||||
template <typename _K1, typename _T1, typename _C1, typename _A1>
|
||||
friend bool
|
||||
operator< (const map<_K1,_T1,_C1,_A1>&,
|
||||
const map<_K1,_T1,_C1,_A1>&);
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief Map equality comparison.
|
||||
* @param x A %map.
|
||||
* @param y A %map of the same type as @a x.
|
||||
* @return True iff the size and elements of the maps are equal.
|
||||
*
|
||||
* This is an equivalence relation. It is linear in the size of the
|
||||
* maps. Maps are considered equivalent if their sizes are equal,
|
||||
* and if corresponding elements compare equal.
|
||||
*/
|
||||
template <typename _Key, typename _Tp, typename _Compare, typename _Alloc>
|
||||
inline bool
|
||||
operator==(const map<_Key,_Tp,_Compare,_Alloc>& __x,
|
||||
const map<_Key,_Tp,_Compare,_Alloc>& __y)
|
||||
{ return __x._M_t == __y._M_t; }
|
||||
|
||||
/**
|
||||
* @brief Map ordering relation.
|
||||
* @param x A %map.
|
||||
* @param y A %map of the same type as @a x.
|
||||
* @return True iff @a x is lexicographically less than @a y.
|
||||
*
|
||||
* This is a total ordering relation. It is linear in the size of the
|
||||
* maps. The elements must be comparable with @c <.
|
||||
*
|
||||
* See std::lexicographical_compare() for how the determination is made.
|
||||
*/
|
||||
template <typename _Key, typename _Tp, typename _Compare, typename _Alloc>
|
||||
inline bool
|
||||
operator<(const map<_Key,_Tp,_Compare,_Alloc>& __x,
|
||||
const map<_Key,_Tp,_Compare,_Alloc>& __y)
|
||||
{ return __x._M_t < __y._M_t; }
|
||||
|
||||
/// Based on operator==
|
||||
template <typename _Key, typename _Tp, typename _Compare, typename _Alloc>
|
||||
inline bool
|
||||
operator!=(const map<_Key,_Tp,_Compare,_Alloc>& __x,
|
||||
const map<_Key,_Tp,_Compare,_Alloc>& __y)
|
||||
{ return !(__x == __y); }
|
||||
|
||||
/// Based on operator<
|
||||
template <typename _Key, typename _Tp, typename _Compare, typename _Alloc>
|
||||
inline bool
|
||||
operator>(const map<_Key,_Tp,_Compare,_Alloc>& __x,
|
||||
const map<_Key,_Tp,_Compare,_Alloc>& __y)
|
||||
{ return __y < __x; }
|
||||
|
||||
/// Based on operator<
|
||||
template <typename _Key, typename _Tp, typename _Compare, typename _Alloc>
|
||||
inline bool
|
||||
operator<=(const map<_Key,_Tp,_Compare,_Alloc>& __x,
|
||||
const map<_Key,_Tp,_Compare,_Alloc>& __y)
|
||||
{ return !(__y < __x); }
|
||||
|
||||
/// Based on operator<
|
||||
template <typename _Key, typename _Tp, typename _Compare, typename _Alloc>
|
||||
inline bool
|
||||
operator>=(const map<_Key,_Tp,_Compare,_Alloc>& __x,
|
||||
const map<_Key,_Tp,_Compare,_Alloc>& __y)
|
||||
{ return !(__x < __y); }
|
||||
|
||||
/// See std::map::swap().
|
||||
template <typename _Key, typename _Tp, typename _Compare, typename _Alloc>
|
||||
inline void
|
||||
swap(map<_Key,_Tp,_Compare,_Alloc>& __x, map<_Key,_Tp,_Compare,_Alloc>& __y)
|
||||
{ __x.swap(__y); }
|
||||
} // namespace std
|
||||
|
||||
#endif /* _MAP_H */
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue