narnaud
2 years ago
8 changed files with 758 additions and 0 deletions
@ -0,0 +1,192 @@ |
|||||
|
--- |
||||
|
Language: Cpp |
||||
|
# BasedOnStyle: LLVM |
||||
|
AccessModifierOffset: -2 |
||||
|
AlignAfterOpenBracket: Align |
||||
|
AlignArrayOfStructures: None |
||||
|
AlignConsecutiveMacros: None |
||||
|
AlignConsecutiveAssignments: None |
||||
|
AlignConsecutiveBitFields: None |
||||
|
AlignConsecutiveDeclarations: Consecutive |
||||
|
AlignEscapedNewlines: Right |
||||
|
AlignOperands: Align |
||||
|
AlignTrailingComments: true |
||||
|
AllowAllArgumentsOnNextLine: true |
||||
|
AllowAllParametersOfDeclarationOnNextLine: true |
||||
|
AllowShortEnumsOnASingleLine: true |
||||
|
AllowShortBlocksOnASingleLine: Never |
||||
|
AllowShortCaseLabelsOnASingleLine: false |
||||
|
AllowShortFunctionsOnASingleLine: All |
||||
|
AllowShortLambdasOnASingleLine: All |
||||
|
AllowShortIfStatementsOnASingleLine: Never |
||||
|
AllowShortLoopsOnASingleLine: false |
||||
|
AlwaysBreakAfterDefinitionReturnType: None |
||||
|
AlwaysBreakAfterReturnType: None |
||||
|
AlwaysBreakBeforeMultilineStrings: false |
||||
|
AlwaysBreakTemplateDeclarations: MultiLine |
||||
|
AttributeMacros: |
||||
|
- __capability |
||||
|
BinPackArguments: true |
||||
|
BinPackParameters: true |
||||
|
BraceWrapping: |
||||
|
AfterCaseLabel: false |
||||
|
AfterClass: false |
||||
|
AfterControlStatement: Never |
||||
|
AfterEnum: false |
||||
|
AfterFunction: false |
||||
|
AfterNamespace: false |
||||
|
AfterObjCDeclaration: false |
||||
|
AfterStruct: false |
||||
|
AfterUnion: false |
||||
|
AfterExternBlock: false |
||||
|
BeforeCatch: false |
||||
|
BeforeElse: false |
||||
|
BeforeLambdaBody: false |
||||
|
BeforeWhile: false |
||||
|
IndentBraces: false |
||||
|
SplitEmptyFunction: true |
||||
|
SplitEmptyRecord: true |
||||
|
SplitEmptyNamespace: true |
||||
|
BreakBeforeBinaryOperators: None |
||||
|
BreakBeforeConceptDeclarations: true |
||||
|
BreakBeforeBraces: Attach |
||||
|
BreakBeforeInheritanceComma: false |
||||
|
BreakInheritanceList: BeforeColon |
||||
|
BreakBeforeTernaryOperators: true |
||||
|
BreakConstructorInitializersBeforeComma: false |
||||
|
BreakConstructorInitializers: BeforeColon |
||||
|
BreakAfterJavaFieldAnnotations: false |
||||
|
BreakStringLiterals: true |
||||
|
ColumnLimit: 80 |
||||
|
CommentPragmas: '^ IWYU pragma:' |
||||
|
QualifierAlignment: Leave |
||||
|
CompactNamespaces: false |
||||
|
ConstructorInitializerIndentWidth: 4 |
||||
|
ContinuationIndentWidth: 4 |
||||
|
Cpp11BracedListStyle: true |
||||
|
DeriveLineEnding: true |
||||
|
DerivePointerAlignment: false |
||||
|
DisableFormat: false |
||||
|
EmptyLineAfterAccessModifier: Never |
||||
|
EmptyLineBeforeAccessModifier: LogicalBlock |
||||
|
ExperimentalAutoDetectBinPacking: false |
||||
|
PackConstructorInitializers: BinPack |
||||
|
BasedOnStyle: '' |
||||
|
ConstructorInitializerAllOnOneLineOrOnePerLine: false |
||||
|
AllowAllConstructorInitializersOnNextLine: true |
||||
|
FixNamespaceComments: true |
||||
|
ForEachMacros: |
||||
|
- foreach |
||||
|
- Q_FOREACH |
||||
|
- BOOST_FOREACH |
||||
|
IfMacros: |
||||
|
- KJ_IF_MAYBE |
||||
|
IncludeBlocks: Preserve |
||||
|
IncludeCategories: |
||||
|
- Regex: '^"(llvm|llvm-c|clang|clang-c)/' |
||||
|
Priority: 2 |
||||
|
SortPriority: 0 |
||||
|
CaseSensitive: false |
||||
|
- Regex: '^(<|"(gtest|gmock|isl|json)/)' |
||||
|
Priority: 3 |
||||
|
SortPriority: 0 |
||||
|
CaseSensitive: false |
||||
|
- Regex: '.*' |
||||
|
Priority: 1 |
||||
|
SortPriority: 0 |
||||
|
CaseSensitive: false |
||||
|
IncludeIsMainRegex: '(Test)?$' |
||||
|
IncludeIsMainSourceRegex: '' |
||||
|
IndentAccessModifiers: false |
||||
|
IndentCaseLabels: false |
||||
|
IndentCaseBlocks: false |
||||
|
IndentGotoLabels: true |
||||
|
IndentPPDirectives: None |
||||
|
IndentExternBlock: AfterExternBlock |
||||
|
IndentRequires: false |
||||
|
IndentWidth: 2 |
||||
|
IndentWrappedFunctionNames: false |
||||
|
InsertTrailingCommas: None |
||||
|
JavaScriptQuotes: Leave |
||||
|
JavaScriptWrapImports: true |
||||
|
KeepEmptyLinesAtTheStartOfBlocks: true |
||||
|
LambdaBodyIndentation: Signature |
||||
|
MacroBlockBegin: '' |
||||
|
MacroBlockEnd: '' |
||||
|
MaxEmptyLinesToKeep: 1 |
||||
|
NamespaceIndentation: None |
||||
|
ObjCBinPackProtocolList: Auto |
||||
|
ObjCBlockIndentWidth: 2 |
||||
|
ObjCBreakBeforeNestedBlockParam: true |
||||
|
ObjCSpaceAfterProperty: false |
||||
|
ObjCSpaceBeforeProtocolList: true |
||||
|
PenaltyBreakAssignment: 2 |
||||
|
PenaltyBreakBeforeFirstCallParameter: 19 |
||||
|
PenaltyBreakComment: 300 |
||||
|
PenaltyBreakFirstLessLess: 120 |
||||
|
PenaltyBreakOpenParenthesis: 0 |
||||
|
PenaltyBreakString: 1000 |
||||
|
PenaltyBreakTemplateDeclaration: 10 |
||||
|
PenaltyExcessCharacter: 1000000 |
||||
|
PenaltyReturnTypeOnItsOwnLine: 60 |
||||
|
PenaltyIndentedWhitespace: 0 |
||||
|
PointerAlignment: Right |
||||
|
PPIndentWidth: -1 |
||||
|
ReferenceAlignment: Pointer |
||||
|
ReflowComments: true |
||||
|
RemoveBracesLLVM: false |
||||
|
SeparateDefinitionBlocks: Leave |
||||
|
ShortNamespaceLines: 1 |
||||
|
SortIncludes: CaseSensitive |
||||
|
SortJavaStaticImport: Before |
||||
|
SortUsingDeclarations: true |
||||
|
SpaceAfterCStyleCast: false |
||||
|
SpaceAfterLogicalNot: false |
||||
|
SpaceAfterTemplateKeyword: true |
||||
|
SpaceBeforeAssignmentOperators: true |
||||
|
SpaceBeforeCaseColon: false |
||||
|
SpaceBeforeCpp11BracedList: false |
||||
|
SpaceBeforeCtorInitializerColon: true |
||||
|
SpaceBeforeInheritanceColon: true |
||||
|
SpaceBeforeParens: ControlStatements |
||||
|
SpaceBeforeParensOptions: |
||||
|
AfterControlStatements: true |
||||
|
AfterForeachMacros: true |
||||
|
AfterFunctionDefinitionName: false |
||||
|
AfterFunctionDeclarationName: false |
||||
|
AfterIfMacros: true |
||||
|
AfterOverloadedOperator: false |
||||
|
BeforeNonEmptyParentheses: false |
||||
|
SpaceAroundPointerQualifiers: Default |
||||
|
SpaceBeforeRangeBasedForLoopColon: true |
||||
|
SpaceInEmptyBlock: false |
||||
|
SpaceInEmptyParentheses: false |
||||
|
SpacesBeforeTrailingComments: 1 |
||||
|
SpacesInAngles: true |
||||
|
SpacesInConditionalStatement: false |
||||
|
SpacesInContainerLiterals: true |
||||
|
SpacesInCStyleCastParentheses: false |
||||
|
SpacesInLineCommentPrefix: |
||||
|
Minimum: 1 |
||||
|
Maximum: -1 |
||||
|
SpacesInParentheses: false |
||||
|
SpacesInSquareBrackets: false |
||||
|
SpaceBeforeSquareBrackets: false |
||||
|
BitFieldColonSpacing: Both |
||||
|
Standard: Latest |
||||
|
StatementAttributeLikeMacros: |
||||
|
- Q_EMIT |
||||
|
StatementMacros: |
||||
|
- Q_UNUSED |
||||
|
- QT_REQUIRE_VERSION |
||||
|
TabWidth: 8 |
||||
|
UseCRLF: false |
||||
|
UseTab: Never |
||||
|
WhitespaceSensitiveMacros: |
||||
|
- STRINGIZE |
||||
|
- PP_STRINGIZE |
||||
|
- BOOST_PP_STRINGIZE |
||||
|
- NS_SWIFT_NAME |
||||
|
- CF_SWIFT_NAME |
||||
|
... |
||||
|
|
@ -0,0 +1,16 @@ |
|||||
|
CXXFLAGS= -std=c++98 -Werror -Wextra -Wall -Iincludes |
||||
|
|
||||
|
all: tester |
||||
|
|
||||
|
tester: tester.o |
||||
|
c++ tester.o -o tester |
||||
|
|
||||
|
clean: |
||||
|
rm -rf tester.o |
||||
|
|
||||
|
fclean: clean |
||||
|
rm -rf tester |
||||
|
|
||||
|
re: fclean re |
||||
|
|
||||
|
.PHONY: all clean fclean re |
@ -0,0 +1,199 @@ |
|||||
|
let SessionLoad = 1 |
||||
|
let s:so_save = &g:so | let s:siso_save = &g:siso | setg so=0 siso=0 | setl so=-1 siso=-1 |
||||
|
let v:this_session=expand("<sfile>:p") |
||||
|
silent only |
||||
|
silent tabonly |
||||
|
cd ~/Development/ft_container |
||||
|
if expand('%') == '' && !&modified && line('$') <= 1 && getline(1) == '' |
||||
|
let s:wipebuf = bufnr('%') |
||||
|
endif |
||||
|
let s:shortmess_save = &shortmess |
||||
|
if &shortmess =~ 'A' |
||||
|
set shortmess=aoOA |
||||
|
else |
||||
|
set shortmess=aoO |
||||
|
endif |
||||
|
badd +1 Makefile |
||||
|
badd +1 tester.cpp |
||||
|
badd +121 includes/vector.hpp |
||||
|
badd +1 main.cpp |
||||
|
badd +1 includes/ft_container.hpp |
||||
|
badd +193 includes/iterator.hpp |
||||
|
argglobal |
||||
|
%argdel |
||||
|
$argadd main.cpp |
||||
|
tabnew +setlocal\ bufhidden=wipe |
||||
|
tabrewind |
||||
|
edit Makefile |
||||
|
let s:save_splitbelow = &splitbelow |
||||
|
let s:save_splitright = &splitright |
||||
|
set splitbelow splitright |
||||
|
wincmd _ | wincmd | |
||||
|
vsplit |
||||
|
wincmd _ | wincmd | |
||||
|
vsplit |
||||
|
2wincmd h |
||||
|
wincmd w |
||||
|
wincmd w |
||||
|
let &splitbelow = s:save_splitbelow |
||||
|
let &splitright = s:save_splitright |
||||
|
wincmd t |
||||
|
let s:save_winminheight = &winminheight |
||||
|
let s:save_winminwidth = &winminwidth |
||||
|
set winminheight=0 |
||||
|
set winheight=1 |
||||
|
set winminwidth=0 |
||||
|
set winwidth=1 |
||||
|
exe 'vert 1resize ' . ((&columns * 84 + 127) / 254) |
||||
|
exe 'vert 2resize ' . ((&columns * 84 + 127) / 254) |
||||
|
exe 'vert 3resize ' . ((&columns * 84 + 127) / 254) |
||||
|
argglobal |
||||
|
balt includes/ft_container.hpp |
||||
|
setlocal fdm=manual |
||||
|
setlocal fde= |
||||
|
setlocal fmr={{{,}}} |
||||
|
setlocal fdi=# |
||||
|
setlocal fdl=0 |
||||
|
setlocal fml=1 |
||||
|
setlocal fdn=20 |
||||
|
setlocal fen |
||||
|
silent! normal! zE |
||||
|
let &fdl = &fdl |
||||
|
let s:l = 1 - ((0 * winheight(0) + 32) / 65) |
||||
|
if s:l < 1 | let s:l = 1 | endif |
||||
|
keepjumps exe s:l |
||||
|
normal! zt |
||||
|
keepjumps 1 |
||||
|
normal! 0 |
||||
|
wincmd w |
||||
|
argglobal |
||||
|
if bufexists(fnamemodify("includes/ft_container.hpp", ":p")) | buffer includes/ft_container.hpp | else | edit includes/ft_container.hpp | endif |
||||
|
if &buftype ==# 'terminal' |
||||
|
silent file includes/ft_container.hpp |
||||
|
endif |
||||
|
balt Makefile |
||||
|
setlocal fdm=manual |
||||
|
setlocal fde= |
||||
|
setlocal fmr={{{,}}} |
||||
|
setlocal fdi=# |
||||
|
setlocal fdl=0 |
||||
|
setlocal fml=1 |
||||
|
setlocal fdn=20 |
||||
|
setlocal fen |
||||
|
silent! normal! zE |
||||
|
let &fdl = &fdl |
||||
|
let s:l = 4 - ((3 * winheight(0) + 32) / 65) |
||||
|
if s:l < 1 | let s:l = 1 | endif |
||||
|
keepjumps exe s:l |
||||
|
normal! zt |
||||
|
keepjumps 4 |
||||
|
normal! 022| |
||||
|
wincmd w |
||||
|
argglobal |
||||
|
if bufexists(fnamemodify("tester.cpp", ":p")) | buffer tester.cpp | else | edit tester.cpp | endif |
||||
|
if &buftype ==# 'terminal' |
||||
|
silent file tester.cpp |
||||
|
endif |
||||
|
balt Makefile |
||||
|
setlocal fdm=manual |
||||
|
setlocal fde= |
||||
|
setlocal fmr={{{,}}} |
||||
|
setlocal fdi=# |
||||
|
setlocal fdl=0 |
||||
|
setlocal fml=1 |
||||
|
setlocal fdn=20 |
||||
|
setlocal fen |
||||
|
silent! normal! zE |
||||
|
let &fdl = &fdl |
||||
|
let s:l = 3 - ((2 * winheight(0) + 32) / 65) |
||||
|
if s:l < 1 | let s:l = 1 | endif |
||||
|
keepjumps exe s:l |
||||
|
normal! zt |
||||
|
keepjumps 3 |
||||
|
normal! 0 |
||||
|
wincmd w |
||||
|
exe 'vert 1resize ' . ((&columns * 84 + 127) / 254) |
||||
|
exe 'vert 2resize ' . ((&columns * 84 + 127) / 254) |
||||
|
exe 'vert 3resize ' . ((&columns * 84 + 127) / 254) |
||||
|
tabnext |
||||
|
edit includes/iterator.hpp |
||||
|
let s:save_splitbelow = &splitbelow |
||||
|
let s:save_splitright = &splitright |
||||
|
set splitbelow splitright |
||||
|
wincmd _ | wincmd | |
||||
|
vsplit |
||||
|
1wincmd h |
||||
|
wincmd w |
||||
|
let &splitbelow = s:save_splitbelow |
||||
|
let &splitright = s:save_splitright |
||||
|
wincmd t |
||||
|
let s:save_winminheight = &winminheight |
||||
|
let s:save_winminwidth = &winminwidth |
||||
|
set winminheight=0 |
||||
|
set winheight=1 |
||||
|
set winminwidth=0 |
||||
|
set winwidth=1 |
||||
|
exe 'vert 1resize ' . ((&columns * 126 + 127) / 254) |
||||
|
exe 'vert 2resize ' . ((&columns * 127 + 127) / 254) |
||||
|
argglobal |
||||
|
balt includes/vector.hpp |
||||
|
setlocal fdm=manual |
||||
|
setlocal fde= |
||||
|
setlocal fmr={{{,}}} |
||||
|
setlocal fdi=# |
||||
|
setlocal fdl=0 |
||||
|
setlocal fml=1 |
||||
|
setlocal fdn=20 |
||||
|
setlocal fen |
||||
|
silent! normal! zE |
||||
|
let &fdl = &fdl |
||||
|
let s:l = 67 - ((8 * winheight(0) + 32) / 65) |
||||
|
if s:l < 1 | let s:l = 1 | endif |
||||
|
keepjumps exe s:l |
||||
|
normal! zt |
||||
|
keepjumps 67 |
||||
|
normal! 03| |
||||
|
wincmd w |
||||
|
argglobal |
||||
|
if bufexists(fnamemodify("includes/vector.hpp", ":p")) | buffer includes/vector.hpp | else | edit includes/vector.hpp | endif |
||||
|
if &buftype ==# 'terminal' |
||||
|
silent file includes/vector.hpp |
||||
|
endif |
||||
|
setlocal fdm=manual |
||||
|
setlocal fde= |
||||
|
setlocal fmr={{{,}}} |
||||
|
setlocal fdi=# |
||||
|
setlocal fdl=0 |
||||
|
setlocal fml=1 |
||||
|
setlocal fdn=20 |
||||
|
setlocal fen |
||||
|
silent! normal! zE |
||||
|
let &fdl = &fdl |
||||
|
let s:l = 7 - ((6 * winheight(0) + 32) / 65) |
||||
|
if s:l < 1 | let s:l = 1 | endif |
||||
|
keepjumps exe s:l |
||||
|
normal! zt |
||||
|
keepjumps 7 |
||||
|
normal! 02| |
||||
|
wincmd w |
||||
|
2wincmd w |
||||
|
exe 'vert 1resize ' . ((&columns * 126 + 127) / 254) |
||||
|
exe 'vert 2resize ' . ((&columns * 127 + 127) / 254) |
||||
|
tabnext 2 |
||||
|
if exists('s:wipebuf') && len(win_findbuf(s:wipebuf)) == 0 && getbufvar(s:wipebuf, '&buftype') isnot# 'terminal' |
||||
|
silent exe 'bwipe ' . s:wipebuf |
||||
|
endif |
||||
|
unlet! s:wipebuf |
||||
|
set winheight=1 winwidth=20 |
||||
|
let &shortmess = s:shortmess_save |
||||
|
let &winminheight = s:save_winminheight |
||||
|
let &winminwidth = s:save_winminwidth |
||||
|
let s:sx = expand("<sfile>:p:r")."x.vim" |
||||
|
if filereadable(s:sx) |
||||
|
exe "source " . fnameescape(s:sx) |
||||
|
endif |
||||
|
let &g:so = s:so_save | let &g:siso = s:siso_save |
||||
|
set hlsearch |
||||
|
doautoall SessionLoadPost |
||||
|
unlet SessionLoad |
||||
|
" vim: set ft=vim : |
@ -0,0 +1,19 @@ |
|||||
|
[ |
||||
|
{ |
||||
|
"arguments": [ |
||||
|
"/usr/bin/g++", |
||||
|
"-std=c++98", |
||||
|
"-Werror", |
||||
|
"-Wextra", |
||||
|
"-Wall", |
||||
|
"-Iincludes", |
||||
|
"-c", |
||||
|
"-o", |
||||
|
"tester.o", |
||||
|
"tester.cpp" |
||||
|
], |
||||
|
"directory": "/home/narnaud/Development/ft_container", |
||||
|
"file": "/home/narnaud/Development/ft_container/tester.cpp", |
||||
|
"output": "/home/narnaud/Development/ft_container/tester.o" |
||||
|
} |
||||
|
] |
@ -0,0 +1,5 @@ |
|||||
|
#pragma once |
||||
|
|
||||
|
#include "vector.hpp" |
||||
|
#include "iterator.hpp" |
||||
|
|
@ -0,0 +1,197 @@ |
|||||
|
#pragma once |
||||
|
#include <cstddef> |
||||
|
|
||||
|
namespace ft { |
||||
|
|
||||
|
struct input_iterator_tag {}; |
||||
|
struct output_iterator_tag {}; |
||||
|
struct forward_iterator_tag : public input_iterator_tag {}; |
||||
|
struct bidirectional_iterator_tag : public forward_iterator_tag {}; |
||||
|
struct random_access_iterator_tag : public bidirectional_iterator_tag {}; |
||||
|
|
||||
|
template < class Iter > struct iterator_traits { |
||||
|
typedef class Iter::iterator_category iterator_category; |
||||
|
typedef class Iter::value_type value_type; |
||||
|
typedef class Iter::difference_type difference_type; |
||||
|
typedef class Iter::pointer pointer; |
||||
|
typedef class Iter::reference reference; |
||||
|
}; |
||||
|
|
||||
|
template < class T > struct iterator_traits< T * > { |
||||
|
public: |
||||
|
typedef random_access_iterator_tag iterator_category; |
||||
|
typedef T value_type; |
||||
|
typedef std::ptrdiff_t difference_type; |
||||
|
typedef T *pointer; |
||||
|
typedef T &reference; |
||||
|
}; |
||||
|
|
||||
|
template < class T > struct iterator_traits< const T * > { |
||||
|
typedef random_access_iterator_tag iterator_category; |
||||
|
typedef T value_type; |
||||
|
typedef std::ptrdiff_t difference_type; |
||||
|
typedef const T *pointer; |
||||
|
typedef const T &reference; |
||||
|
}; |
||||
|
|
||||
|
// Iterator classes:
|
||||
|
|
||||
|
template < class T > class ra_iterator { |
||||
|
typedef random_access_iterator_tag iterator_category; |
||||
|
typedef T value_type; |
||||
|
typedef std::ptrdiff_t difference_type; |
||||
|
typedef T *pointer; |
||||
|
typedef T &reference; |
||||
|
T current; |
||||
|
|
||||
|
public: |
||||
|
ra_iterator(T value = NULL) : current(value) {} |
||||
|
ra_iterator(const ra_iterator &iter) : current(iter.base()) {} |
||||
|
|
||||
|
ra_iterator &operator=(const ra_iterator< T > &iter) { |
||||
|
current = iter.base(); |
||||
|
return (*this); |
||||
|
} |
||||
|
|
||||
|
T base(void) const { return current; } |
||||
|
reference operator*(void) const { return *current; } |
||||
|
pointer operator->(void) const { return current; } |
||||
|
reference operator[](const difference_type n) const { return *(current + n); } |
||||
|
|
||||
|
ra_iterator operator+(const difference_type n) const { |
||||
|
return (iterator(current + n)); |
||||
|
} |
||||
|
ra_iterator &operator++() { |
||||
|
++current; |
||||
|
return *this; |
||||
|
} |
||||
|
ra_iterator operator++(int) { |
||||
|
ra_iterator tmp(*this); |
||||
|
++(*this); |
||||
|
return tmp; |
||||
|
} |
||||
|
ra_iterator &operator+=(const difference_type other) { |
||||
|
current += other; |
||||
|
return *this; |
||||
|
} |
||||
|
|
||||
|
ra_iterator operator-(const difference_type n) const { |
||||
|
return (iterator(current - n)); |
||||
|
} |
||||
|
ra_iterator &operator--() { |
||||
|
--current; |
||||
|
return *this; |
||||
|
} |
||||
|
ra_iterator operator--(int) { |
||||
|
ra_iterator tmp(*this); |
||||
|
--(*this); |
||||
|
return tmp; |
||||
|
} |
||||
|
ra_iterator &operator-=(const difference_type other) { |
||||
|
current -= other; |
||||
|
return *this; |
||||
|
} |
||||
|
|
||||
|
bool operator==(const ra_iterator &right) const { |
||||
|
return current == right.base(); |
||||
|
} |
||||
|
bool operator!=(const ra_iterator &right) const { |
||||
|
return current != right.base(); |
||||
|
} |
||||
|
bool operator<(const ra_iterator &right) const { |
||||
|
return current < right.base(); |
||||
|
} |
||||
|
bool operator>(const ra_iterator &right) const { |
||||
|
return current > right.base(); |
||||
|
} |
||||
|
bool operator<=(const ra_iterator &right) const { |
||||
|
return current <= right.base(); |
||||
|
} |
||||
|
bool operator>=(const ra_iterator &right) const { |
||||
|
return current >= right.base(); |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
template < class T > class rev_iterator { |
||||
|
T current; |
||||
|
typedef random_access_iterator_tag iterator_category; |
||||
|
typedef T value_type; |
||||
|
typedef std::ptrdiff_t difference_type; |
||||
|
typedef T *pointer; |
||||
|
typedef T &reference; |
||||
|
|
||||
|
public: |
||||
|
rev_iterator(T value = NULL) : current(value) {} |
||||
|
rev_iterator(const rev_iterator &iter) : current(iter.base()) {} |
||||
|
rev_iterator &operator=(const rev_iterator< T > &iter) { |
||||
|
current = iter.base(); |
||||
|
return (*this); |
||||
|
} |
||||
|
|
||||
|
T base(void) const { return current; } |
||||
|
reference operator*(void) const { return *(current - 1); } |
||||
|
pointer operator->(void) const { return current - 1; } |
||||
|
reference operator[](const difference_type n) const { return *(current - n); } |
||||
|
|
||||
|
rev_iterator operator+(const difference_type n) const { |
||||
|
return (rev_iterator(current - n)); |
||||
|
} |
||||
|
rev_iterator &operator++() { |
||||
|
--current; |
||||
|
return *this; |
||||
|
} |
||||
|
rev_iterator operator++(int) const { |
||||
|
rev_iterator tmp(*this); |
||||
|
--(*this); |
||||
|
return tmp; |
||||
|
} |
||||
|
rev_iterator &operator+=(const difference_type n) { |
||||
|
current -= n; |
||||
|
return *this; |
||||
|
} |
||||
|
|
||||
|
rev_iterator operator-(const difference_type n) const { |
||||
|
return (rev_iterator(current + n)); |
||||
|
} |
||||
|
rev_iterator &operator--() { |
||||
|
++current; |
||||
|
return *this; |
||||
|
} |
||||
|
rev_iterator operator--(int) { |
||||
|
rev_iterator tmp(*this); |
||||
|
++(*this); |
||||
|
return tmp; |
||||
|
} |
||||
|
rev_iterator &operator-=(const difference_type n) { |
||||
|
current += n; |
||||
|
return *this; |
||||
|
} |
||||
|
|
||||
|
bool operator==(const rev_iterator< T > &right) const { |
||||
|
return current == right.base(); |
||||
|
} |
||||
|
bool operator!=(const rev_iterator< T > &right) const { |
||||
|
return current != right.base(); |
||||
|
} |
||||
|
bool operator<(const rev_iterator< T > &right) const { |
||||
|
return current >= right.base(); |
||||
|
} |
||||
|
bool operator>(const rev_iterator< T > &right) const { |
||||
|
return current <= right.base(); |
||||
|
} |
||||
|
bool operator<=(const rev_iterator< T > &right) const { |
||||
|
return current > right.base(); |
||||
|
} |
||||
|
bool operator>=(const rev_iterator< T > &right) const { |
||||
|
return current < right.base(); |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
template < class It > std::size_t distance(It first, It last) { |
||||
|
size_t ret = 0; |
||||
|
while (first != last && ret++) |
||||
|
first++; |
||||
|
return ret; |
||||
|
} |
||||
|
|
||||
|
} // namespace ft
|
@ -0,0 +1,125 @@ |
|||||
|
#pragma once |
||||
|
#include "iterator.hpp" |
||||
|
#include <memory> |
||||
|
|
||||
|
namespace ft { |
||||
|
|
||||
|
template < class T, class Allocator = std::allocator< T > > class vector { |
||||
|
public: |
||||
|
typedef T value_type; |
||||
|
typedef Allocator allocator_type; |
||||
|
typedef class Allocator::pointer pointer; |
||||
|
typedef class Allocator::const_pointer cst_pointer; |
||||
|
typedef value_type &reference; |
||||
|
typedef const value_type &cst_reference; |
||||
|
typedef ft::ra_iterator< pointer > iterator; |
||||
|
typedef ft::ra_iterator< cst_pointer > cst_iterator; |
||||
|
typedef ft::rev_iterator< iterator > reverse_iterator; |
||||
|
typedef ft::rev_iterator< cst_iterator > cst_reverse_iterator; |
||||
|
typedef std::ptrdiff_t difference_type; |
||||
|
typedef std::size_t size_type; |
||||
|
|
||||
|
private: |
||||
|
Allocator _alloc; |
||||
|
pointer _begin; |
||||
|
size_type _size; |
||||
|
size_type _capacity; |
||||
|
|
||||
|
public: |
||||
|
vector(void) : _alloc(Allocator()), _begin(NULL), _size(0), _capacity(0) {} |
||||
|
|
||||
|
explicit vector(const Allocator &alloc) |
||||
|
: _alloc(alloc), _begin(NULL), _size(0), _capacity(0){}; |
||||
|
|
||||
|
explicit vector(size_type count, const T &value = T(), |
||||
|
const Allocator &alloc = Allocator()) |
||||
|
: _alloc(alloc), _size(count), _capacity(count) { |
||||
|
_begin = _alloc.allocate(count); |
||||
|
for (size_type i = 0; i < count; i++) |
||||
|
alloc.construct(_begin + i, value); |
||||
|
} |
||||
|
|
||||
|
template < class It > |
||||
|
vector(It first, It last, const Allocator &alloc = Allocator()) |
||||
|
: _alloc(alloc) { |
||||
|
_size = distance(first, last); |
||||
|
_capacity = _size; |
||||
|
_begin = _alloc.allocate(_size); |
||||
|
for (size_type i = 0; i < _size; i++) |
||||
|
_alloc.construct(_begin + i, *(first + i)); |
||||
|
} |
||||
|
|
||||
|
vector(const vector &other) |
||||
|
: _alloc(other._alloc), _size(other._size), _capacity(other._capacity) { |
||||
|
_begin = _alloc.allocate(_capacity); |
||||
|
for (size_type i = 0; i < _size; i++) |
||||
|
_alloc.construct(_begin + i, *(other._begin + i)); |
||||
|
} |
||||
|
|
||||
|
~vector(void) { |
||||
|
clear(); |
||||
|
if (_capacity) |
||||
|
_alloc.deallocate(_begin, _capacity); |
||||
|
} |
||||
|
|
||||
|
vector &operator=(const vector &other); |
||||
|
void assign(size_type count, const T &value); |
||||
|
template < class It > void assign(It first, It last); |
||||
|
allocator_type get_allocator(void) const { return _alloc; } |
||||
|
|
||||
|
// ACCESS:
|
||||
|
reference at(size_type pos); |
||||
|
cst_reference at(size_type pos) const; |
||||
|
|
||||
|
reference operator[](size_type pos); |
||||
|
cst_reference operator[](size_type pos) const; |
||||
|
|
||||
|
reference front(void); |
||||
|
cst_reference front(void) const; |
||||
|
|
||||
|
reference back(void); |
||||
|
cst_reference back(void) const; |
||||
|
|
||||
|
T *data(void); |
||||
|
const T *data(void) const; |
||||
|
|
||||
|
// ITERATORS:
|
||||
|
ft::ra_iterator< reference > begin(void); |
||||
|
ft::ra_iterator< cst_reference > begin(void) const; |
||||
|
|
||||
|
ft::ra_iterator< reference > end(void); |
||||
|
ft::ra_iterator< cst_reference > end(void) const; |
||||
|
|
||||
|
ft::rev_iterator< iterator > rbegin(void); |
||||
|
ft::rev_iterator< cst_iterator > rbegin(void) const; |
||||
|
|
||||
|
ft::rev_iterator< iterator > rend(void); |
||||
|
ft::rev_iterator< cst_iterator > rend(void) const; |
||||
|
|
||||
|
// CAPACITY:
|
||||
|
bool empty(void) const; |
||||
|
size_type size(void) const; |
||||
|
size_type max_size(void) const; |
||||
|
void reserve(size_type new_cap); |
||||
|
size_type capacity(void) const; |
||||
|
|
||||
|
// MODIFIERS:
|
||||
|
void clear(void) { |
||||
|
for (size_type i = 0; i < _size; i++) |
||||
|
_alloc.destroy(_begin + i); |
||||
|
_size = 0; |
||||
|
} |
||||
|
iterator insert(cst_iterator pos, const T &value); |
||||
|
iterator insert(cst_iterator pos, size_type count, const T &value); |
||||
|
template < class It > iterator insert(cst_iterator pos, It first, It last); |
||||
|
iterator erase(iterator pos); |
||||
|
iterator erase(iterator first, iterator last); |
||||
|
void push_back(const T& value); |
||||
|
void pop_back(void); |
||||
|
void resize(size_type count); |
||||
|
void resize(size_type count, T value = T()); |
||||
|
void swap( vector& other); |
||||
|
|
||||
|
}; |
||||
|
|
||||
|
} // namespace ft
|
@ -0,0 +1,5 @@ |
|||||
|
#include "ft_container.hpp" |
||||
|
|
||||
|
int main(void) { |
||||
|
|
||||
|
} |
Loading…
Reference in new issue