summaryrefslogtreecommitdiff
path: root/tex/.texmf/tex/generic/pgfplots/liststructure/pgfplotsdeque.code.tex
diff options
context:
space:
mode:
Diffstat (limited to 'tex/.texmf/tex/generic/pgfplots/liststructure/pgfplotsdeque.code.tex')
-rw-r--r--tex/.texmf/tex/generic/pgfplots/liststructure/pgfplotsdeque.code.tex125
1 files changed, 125 insertions, 0 deletions
diff --git a/tex/.texmf/tex/generic/pgfplots/liststructure/pgfplotsdeque.code.tex b/tex/.texmf/tex/generic/pgfplots/liststructure/pgfplotsdeque.code.tex
new file mode 100644
index 0000000..7a524f1
--- /dev/null
+++ b/tex/.texmf/tex/generic/pgfplots/liststructure/pgfplotsdeque.code.tex
@@ -0,0 +1,125 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% This is a helper package with an elementary double-ended-queue
+% (deque) datastructure,
+% featuring O(1) index access and O(N) creation, deletion, copy.
+%
+% The following macros are supplied:
+%
+% \pgfplotsdequenewempty
+% \pgfplotsdequecopy
+% \pgfplotsdequepushback
+% \pgfplotsdequepopfront
+% \pgfplotsdequecheckempty
+% \pgfplotsdequeforeach
+%
+% Copyright 2007/2008 by Christian Feuersänger.
+%
+% 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 3 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, see <http://www.gnu.org/licenses/>.
+%
+%
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% IMPLEMENTATION NOTES:
+% I allocate an array which provides storage capacity and two pointers
+% (indices) into that array.
+%
+% The deque is stored as
+% - an array: \csname pgfpldq@<name>\endcsname
+% - the pointers:
+% \csname pgfpldq@<name>@beg\endcsname
+% \csname pgfpldq@<name>@end\endcsname (one after the end)
+%
+% ATTENTION: <name> may NOT be a control sequence!
+% this is in contrast to my other container structures.
+
+
+% Allocates a new, empty deque #1.
+%
+% #1 the name of a deque (NO control sequence!)
+% #2 is an integer denoting the maximum capacity. For now, this
+% capacity is fixed afterwards and denotes the maximum number of
+% entries.
+\def\pgfplotsdequenewempty#1{%
+ \pgfutil@ifnextchar\capacity{%
+ \pgfplotsdequenewempty@{#1}%
+ }{%
+ \pgfplots@error{Expected \string\capacity\{the capacity\} after \string\pgfplotsdequenewempty...}%
+ \pgfplotsdequenewempty@{#1}\capacity{100}%
+ }%
+}%
+\def\pgfplotsdequenewempty@#1\capacity#2{%
+ \pgfplotsarrayresize{pgfpldq@#1}{#2}%
+ \pgfutil@namedef{pgfpldq@#1@beg}{0}%
+ \pgfutil@namedef{pgfpldq@#1@end}{0}%
+}%
+
+\def\pgfplotsdequecopy#1\to#2{%
+ \pgfutil@namelet{pgfpldq@#1@beg}{pgfpldq@#2@beg}%
+ \pgfutil@namelet{pgfpldq@#1@end}{pgfpldq@#2@end}%
+ \pgfplotsarraycopy{pgfpldq@#1}\to{pgfpldq@#2}%
+}%
+
+\def\pgfplotsdequepushback#1\to#2{%
+ \pgfplotsarrayset{\csname pgfpldq@#2@end\endcsname}\of{pgfpldq@#2}\to{#1}%
+ \c@pgfplotsarray@tmp=\csname pgfpldq@#2@end\endcsname
+ \advance\c@pgfplotsarray@tmp by1
+ \ifnum\c@pgfplotsarray@tmp=\pgfplotsarraysizeof{pgfpldq@#2}
+ \c@pgfplotsarray@tmp=0
+ \fi
+ \expandafter\edef\csname pgfpldq@#2@end\endcsname{\the\c@pgfplotsarray@tmp}%
+ \pgfplotsdequeifempty{#2}{\pgfplots@error{Error: \string\pgfplotsdeque\space capacity has been reached - it was too small. Sorry, I didn't write auto-enlargement...}}{}%
+}%
+
+\def\pgfplotsdequepopfront#1\to#2{%
+ \pgfplotsarrayselect{\csname pgfpldq@#1@beg\endcsname}\of{pgfpldq@#1}\to{#2}%
+ \c@pgfplotsarray@tmp=\csname pgfpldq@#1@beg\endcsname
+ \advance\c@pgfplotsarray@tmp by1
+ \ifnum\c@pgfplotsarray@tmp=\pgfplotsarraysizeof{pgfpldq@#1}
+ \c@pgfplotsarray@tmp=0
+ \fi
+ \expandafter\edef\csname pgfpldq@#1@beg\endcsname{\the\c@pgfplotsarray@tmp}%
+}%
+
+% invokes #2 if deque '#1' is empty and '#3' if it is not empty.
+\def\pgfplotsdequeifempty#1#2#3{%
+ \ifnum\csname pgfpldq@#1@beg\endcsname=\csname pgfpldq@#1@end\endcsname\relax
+ #2%
+ \else
+ #3%
+ \fi
+}%
+
+
+\long\def\pgfplotsdequeforeach#1\as#2#3{%
+ \c@pgfplotsarray@tmp=\csname pgfpldq@#1@beg\endcsname
+ \long\def\pgfplotsdequeforeach@next{\pgfplotsdequeforeach@iter{#1}{#2}{#3}}%
+ \pgfplotsdequeforeach@next
+}%
+\long\def\pgfplotsdequeforeach@iter#1#2#3{%
+ \ifnum\c@pgfplotsarray@tmp=\csname pgfpldq@#1@end\endcsname
+ \def\pgfplotsdequeforeach@next{}%
+ \else
+ \pgfplotsarrayselect\c@pgfplotsarray@tmp\of pgfpldq@#1\to#2%
+ \edef\pgfplotsdequeforeach@{\the\c@pgfplotsarray@tmp}%
+ #3\relax
+ \c@pgfplotsarray@tmp=\pgfplotsdequeforeach@
+ \advance\c@pgfplotsarray@tmp by1
+ \ifnum\c@pgfplotsarray@tmp=\pgfplotsarraysizeof{pgfpldq@#1}
+ \c@pgfplotsarray@tmp=0
+ \fi
+ \fi
+ \pgfplotsdequeforeach@next
+}%