diff --git a/GOLAppLib/doc/html/_g_o_l_8h_source.html b/GOLAppLib/doc/html/_g_o_l_8h_source.html new file mode 100644 index 0000000..a5208f8 --- /dev/null +++ b/GOLAppLib/doc/html/_g_o_l_8h_source.html @@ -0,0 +1,442 @@ + + + + + + + +GOL: D:/Drive/Professionnel/ETS/Enseignement/GPA675/2024_01_Hiver/lab/01/GPA675Lab1App/GOLEngine/GOL.h Source File + + + + + + + + + +
+
+ + + + + + + +
+
GOL +
+
Game Of Life
+
+
+ + + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
D:/Drive/Professionnel/ETS/Enseignement/GPA675/2024_01_Hiver/lab/01/GPA675Lab1App/GOLEngine/GOL.h
+
+
+
1#pragma once
+
2#ifndef GOL_INTERFACE_H
+
3#define GOL_INTERFACE_H
+
4
+
5
+
6#include <string>
+
7#include <vector>
+
8#include <optional>
+
9
+
10
+
11//
+
12// ___ __ __ ____ ___ ____ _____ _ _ _ _____
+
13// |_ _| \/ | _ \ / _ \| _ \_ _|/ \ | \ | |_ _|
+
14// | || |\/| | |_) | | | | |_) || | / _ \ | \| | | |
+
15// | || | | | __/| |_| | _ < | |/ ___ \| |\ | | |
+
16// |___|_| |_|_| \___/|_| \_\|_/_/ \_\_| \_| |_|
+
17//
+
18//
+
19// Attention, vous ne pouvez pas modifier ce fichier.
+
20//
+
21
+
22
+
23
+
+
123class GOL
+
124{
+
125public:
+
126 // ____ __ __ _ _ _ _ _ _
+
127 // | _ \ /_/ / _(_)_ __ (_) |_(_) ___ _ __ __| | ___ ___ | |_ _ _ _ __ ___ ___
+
128 // | | | |/ _ \ |_| | '_ \| | __| |/ _ \| '_ \ / _` |/ _ \/ __| | __| | | | '_ \ / _ \/ __|
+
129 // | |_| | __/ _| | | | | | |_| | (_) | | | | | (_| | __/\__ \ | |_| |_| | |_) | __/\__ \
+
130 // |____/ \___|_| |_|_| |_|_|\__|_|\___/|_| |_| \__,_|\___||___/ \__|\__, | .__/ \___||___/
+
131 // |___/|_|
+
132 //
+
+
135 enum class State : uint8_t {
+
136 dead = 0,
+
137 alive = 1,
+
138 };
+
+
139 //
+
142 using IterationType = uint32_t;
+
143 //
+
+
150 enum class BorderManagement : uint8_t {
+
151 immutableAsIs = 0,
+ + +
154 warping,
+
155 mirror,
+
156 };
+
+
157 //
+
160 using ColorChannelType = uint8_t;
+
161 //
+ +
169 //
+
+
186 struct Statistics {
+
187 std::optional<std::string> rule;
+
188 std::optional<BorderManagement> borderManagement;
+
189 std::optional<size_t> width;
+
190 std::optional<size_t> height;
+
191 std::optional<size_t> totalCells;
+
192 std::optional<IterationType> iteration;
+
193 std::optional<size_t> totalDeadAbs;
+
194 std::optional<size_t> totalAliveAbs;
+
195 std::optional<float> totalDeadRel;
+
196 std::optional<float> totalAliveRel;
+
197 std::optional<int> tendencyAbs;
+
198 std::optional<float> tendencyRel;
+
199 };
+
+
200 //
+
+
203 struct Author {
+
204 std::string lastName;
+
205 std::string firstName;
+
206 std::string studentEmail;
+
207 };
+
+
208 //
+
+ +
219 std::string title;
+
220 std::vector<Author> authors;
+
221 std::vector<std::string> answers;
+
222 std::vector<std::string> optionnalComments;
+
223 };
+
+
224
+
225
+
226
+
227 //
+
228 // ____ _ _ __ ____ _ _
+
229 // / ___|___ _ __ ___| |_ _ __ _ _ ___| |_ ___ _ _ _ __ ___ / / | _ \ ___ ___| |_ _ __ _ _ ___| |_ ___ _ _ _ __
+
230 // | | / _ \| '_ \/ __| __| '__| | | |/ __| __/ _ \ | | | '__/ __| / / | | | |/ _ \/ __| __| '__| | | |/ __| __/ _ \ | | | '__|
+
231 // | |__| (_) | | | \__ \ |_| | | |_| | (__| || __/ |_| | | \__ \ / / | |_| | __/\__ \ |_| | | |_| | (__| || __/ |_| | |
+
232 // \____\___/|_| |_|___/\__|_| \__,_|\___|\__\___|\__,_|_| |___/ /_/ |____/ \___||___/\__|_| \__,_|\___|\__\___|\__,_|_|
+
233 //
+
234 //
+
235 // Les classes héritant de GOL doivent réaliser :
+
236 // - le constructeur par défaut : _class_()
+
237 // - le constructeur d'initialisation proposé : _class_(size_t width, size_t height, State defaultState = State::dead)
+
238 // - le destructeur : ~_class_()
+
239 //
+
241 GOL() = default;
+
242 //
+
244 GOL(size_t width, size_t height, State defaultState = State::dead) {}
+
245 //
+
247 virtual ~GOL() = default;
+
248 //
+
249 // Les 4 autres fonctions spéciales sont laissées à votre discrétion.
+
250 // Toutefois, un simple -delete- est suffisant pour ce premier laboratoire.
+
251 // _class_(_class_ const &) = delete;
+
252 // _class_(_class_ &&) = delete;
+
253 // _class_& operator=(_class_ const &) = delete;
+
254 // _class_& operator=(_class_ &&) = delete;
+
255
+
256
+
257 //
+
258 // _
+
259 // / \ ___ ___ ___ ___ ___ ___ _ _ _ __ ___
+
260 // / _ \ / __/ __/ _ \/ __/ __|/ _ \ | | | '__/ __|
+
261 // / ___ \ (_| (_| __/\__ \__ \ __/ |_| | | \__ \
+
262 // /_/ \_\___\___\___||___/___/\___|\__,_|_| |___/
+
263 //
+
264 //
+
268 virtual size_t width() const = 0;
+
269 //
+
273 virtual size_t height() const = 0;
+
274 //
+
279 virtual size_t size() const = 0;
+
280 //
+
290 virtual State state(int x, int y) const = 0;
+
291 //
+
292 //
+
300 virtual std::string rule() const = 0;
+
301 //
+
302 //
+
306 virtual BorderManagement borderManagement() const = 0;
+
307 //
+
308 //
+
316 virtual Color color(State state) const = 0;
+
317 //
+
318 //
+
346 virtual Statistics statistics() const = 0;
+
347 //
+
348 //
+ +
367 //
+
368 //
+
369 // __ __ _ _
+
370 // | \/ |_ _| |_ __ _| |_ ___ _ _ _ __ ___
+
371 // | |\/| | | | | __/ _` | __/ _ \ | | | '__/ __|
+
372 // | | | | |_| | || (_| | || __/ |_| | | \__ \
+
373 // |_| |_|\__,_|\__\__,_|\__\___|\__,_|_| |___/
+
374 //
+
375 //
+
391 virtual void resize(size_t width, size_t height, State defaultState = State::dead) = 0;
+
392 //
+
393 //
+
432 virtual bool setRule(std::string const & rule) = 0;
+
433 //
+
434 //
+ +
487 //
+
488 //
+
497 virtual void setState(int x, int y, State state) = 0;
+
498 //
+
499 //
+
509 virtual void fill(State state = State::dead) = 0;
+
510 //
+
511 //
+
522 virtual void fillAlternately(State firstCell = State::dead) = 0;
+
523 //
+
524 //
+
536 virtual void randomize(double percentAlive = 0.5) = 0;
+
537 //
+
538 //
+
556 virtual bool setFromPattern(std::string const & pattern, int centerX, int centerY) = 0;
+
557 //
+
558 //
+
569 virtual bool setFromPattern(std::string const & pattern) = 0;
+
570 //
+
571 //
+
582 virtual void setSolidColor(State state, Color const & color) = 0;
+
583
+
584
+
585 //
+
586 //
+
587 // __ __ _ _ __ _ _
+
588 // | \/ | ___ __| (_)/ _(_) ___ __ _| |_ ___ _ _ _ __ ___
+
589 // | |\/| |/ _ \ / _` | | |_| |/ __/ _` | __/ _ \ | | | '__/ __|
+
590 // | | | | (_) | (_| | | _| | (_| (_| | || __/ |_| | | \__ \
+
591 // |_| |_|\___/ \__,_|_|_| |_|\___\__,_|\__\___|\__,_|_| |___/
+
592 //
+
608 virtual void processOneStep() = 0;
+
609 //
+
610 //
+
644 virtual void updateImage(uint32_t * buffer, size_t buffer_size) const = 0;
+
645
+
646};
+
+
647
+
648
+
649
+
650
+
651
+
652
+
653
+
654//
+
655// _ _ _
+
656// (_)_ __ ___ _ __ ___ _ __| |_ __ _ _ __ | |_
+
657// | | '_ ` _ \| '_ \ / _ \| '__| __/ _` | '_ \| __|
+
658// | | | | | | | |_) | (_) | | | || (_| | | | | |_
+
659// |_|_| |_| |_| .__/ \___/|_| \__\__,_|_| |_|\__|
+
660// |_|
+
661//
+
662// Attention, vous devez implémenter et utiliser une classe Grid.
+
663//
+
664// L'ébauche sous forme de commentaire plus bas est un guide
+
665// semi-contraignant.
+
666//
+
667// Toutefois :
+
668// - Vous DEVEZ implémenter l'interface présentée.
+
669// - Vous POUVEZ ajouter des éléments comme vous le voulez.
+
670//
+
671// > Autrement dit, l'interface proposé est minimum.
+
672// > NÉANMOINS, vous devez garder en tête l'intention générique de
+
673// cette classe et ne pas la spécialiser pour le contexte du projet
+
674// de GOL. Par exemple, si on faisait un copier/coller du code et
+
675// qu'on modifiait le CellType pour autre chose (un Vect2D par exemple),
+
676// alors, tout fonctionnerait et la classe serait encore pertinente.
+
677// D'ailleurs, vous remarquez que c'est le seul endroit où il existe un
+
678// lien entre cette classe et le projet courant.
+
679//
+
680// De plus, vous devez gérer manuellement l'allocation dynamique de la mémoire.
+
681//
+
682//
+
683// class Grid // Classe facilitant la gestion d'un tableau dynamique 2d.
+
684// { //
+
685// public: //
+
686// // Définition des types //
+
687// using CellType = GOL::State; // Correspond au type fondamental de chaque cellule de la grille.
+
688// using DataType = ...; // Correspond à la grille, au conteneur de cellules. À vous de déterminer la structure de données à utiliser.
+
689// //
+
690// // Définition des cosntructeurs / destructeur //
+
691// Grid(); //
+
692// Grid(size_t width, size_t height, CellType initValue = CellType{}); //
+
693// Grid(Grid const&) = delete; //
+
694// Grid(Grid&&) = delete; //
+
695// Grid& operator=(Grid const&) = delete; //
+
696// Grid& operator=(Grid&&) = delete; //
+
697// ~Grid(); //
+
698// //
+
699// // Accesseurs et mutateurs de la grille //
+
700// size_t width() const; // Accesseur retournant la largeur de la grille.
+
701// size_t height() const; // Accesseur retournant la hauteur de la grille.
+
702// size_t size() const; // Accesseur retournant le nombre de cellule de la grille.
+
703// //
+
704// void resize(size_t width, size_t height, CellType initValue = CellType{}); // Mutateur modifiant la taille de la grille et initialise le contenu par la valeur spécifiée.
+
705// //
+
706// // Accesseurs et mutateurs des cellules //
+
707// CellType value(int column, int row) const; // Accesseur retournant la valeur d'une cellule à une certaine coordonnée. Pour une raison de performance, cette fonction NE VALIDE PAS ses entrées. Autrement dit, c'est la responsabilité du programmeur utilisateur de faire ses validations, au risque de 'crasher' le programme.
+
708// void setValue(int column, int row, CellType value); // Mutateur modifiant la valeur d'une cellule à une certaine coordonnée. Pour une raison de performance, cette fonction NE VALIDE PAS ses entrées. Autrement dit, c'est la responsabilité du programmeur utilisateur de faire ses validations, au risque de 'crasher' le programme.
+
709// //
+
710// std::optional<CellType> at(int column, int row) const; // Accesseur retournant la valeur d'une cellule à une certaine coordonnée. Cette fonction VALIDE ses entrées et retourne un optional nul si la coordonnée est invalide.
+
711// void setAt(int column, int row, CellType value); // Mutateur modifiant la valeur d'une cellule à une certaine coordonnée. Cette fonction VALIDE ses entrées et ne fait rien si la coordonnée est invalide.
+
712// //
+
713// // Accesseurs du "buffer" de la grille. //
+
714// DataType const & data() const; // Accesseur en lecture seule sur le "buffer" de la grille.
+
715// DataType & data(); // Accesseur en lecture/écriture sur le "buffer" de la grille.
+
716// //
+
717// private: //
+
718// // ... // Il y a des attributs essentiels au fonctionnement de cette classe.
+
719// // ... // À vous de les déterminer.
+
720// // ... //
+
721// }; //
+
722// //
+
723// //
+
724// //
+
725
+
726
+
727
+
728#endif // GOL_INTERFACE_H
+
Moteur de simulation d'un automate cellulaire à 2 dimensions.
Definition GOL.h:124
+
virtual void updateImage(uint32_t *buffer, size_t buffer_size) const =0
Fonction dessinant l'état de la simulation sur une image passée en paramètre.
+
virtual Color color(State state) const =0
Accesseur retournant la couleur d'un état.
+
virtual size_t width() const =0
Accesseur retournant la largeur de la grille de simualtion.
+
virtual void processOneStep()=0
Fonction effectuant une itération de la simulation.
+
GOL()=default
Constructeur par défaut.
+
virtual State state(int x, int y) const =0
Accesseur retournant l'état d'une cellule.
+
virtual std::string rule() const =0
Accesseur retournant la chaîne de caractères correspondant à la règle courante.
+
virtual void randomize(double percentAlive=0.5)=0
Mutateur remplissant de façon aléatoire toutes les cellules de la grille.
+
virtual void setBorderManagement(BorderManagement borderManagement)=0
Mutateur modifiant la stratégie de gestion de bord.
+
virtual size_t height() const =0
Accesseur retournant la hauteur de la grille de simualtion.
+
uint32_t IterationType
Le type représentant le nombre d'itération de la simulation.
Definition GOL.h:142
+
virtual ~GOL()=default
Destructeur.
+
virtual size_t size() const =0
Accesseur retournant le nombre total de cellules de la grille de simualtion.
+
virtual void fill(State state=State::dead)=0
Mutateur remplissant de façon uniforme toutes les cellules de la grille.
+
uint8_t ColorChannelType
Le type représentant un canal de couleur.
Definition GOL.h:160
+
BorderManagement
Le type représentant la stratégie de gestion de bord.
Definition GOL.h:150
+
@ immutableAsIs
Les cellules du contour ne sont jamais modifiées. Elles sont laissées dans leur état courant.
+
@ foreverDead
Les cellules du contour ne sont jamais modifiées. Elles sont toujours mortes.
+
@ foreverAlive
Les cellules du contour ne sont jamais modifiées. Elles sont toujours vivantes.
+
@ warping
Les cellules du contour sont évaluées. On utilise les cellules du côté opposé de la grille pour les c...
+
@ mirror
Les cellules du contour sont évaluées. On utilise les cellules du côté opposé de la cellule pour les ...
+
virtual void setSolidColor(State state, Color const &color)=0
Mutateur modifiant la couleur d'un état.
+
State
Le type représentant l'état d'une cellule.
Definition GOL.h:135
+
@ alive
L'état vivant.
+
@ dead
L'état mort.
+
GOL(size_t width, size_t height, State defaultState=State::dead)
Constructeur d'initialisation personnalisé.
Definition GOL.h:244
+
virtual Statistics statistics() const =0
Accesseurs retournant des informations générales sur la simulation en cours.
+
virtual BorderManagement borderManagement() const =0
Accesseur retournant la stratégie courante de gestion des bords.
+
virtual bool setFromPattern(std::string const &pattern)=0
Mutateur remplissant la grille par le patron passé en argument.
+
virtual void fillAlternately(State firstCell=State::dead)=0
Mutateur remplissant de façon alternée toutes les cellules de la grille.
+
virtual void setState(int x, int y, State state)=0
Mutateur modifiant l'état d'une cellule de la grille.
+
virtual bool setRule(std::string const &rule)=0
Mutateur modifiant la règle de la simulation.
+
virtual ImplementationInformation information() const =0
Accesseurs retournant les informations sur la réalisation de l'implémentation.
+
virtual void resize(size_t width, size_t height, State defaultState=State::dead)=0
Mutateur modifiant la taille de la grille de simulation.
+
virtual bool setFromPattern(std::string const &pattern, int centerX, int centerY)=0
Mutateur remplissant la grille par le patron passé en argument.
+
Le type représentant les informations permettant d'identifier les auteurs de l'implémentation.
Definition GOL.h:203
+
std::string lastName
Le nom de famille de l'auteur.
Definition GOL.h:204
+
std::string firstName
Le prénom de l'auteur.
Definition GOL.h:205
+
std::string studentEmail
L'adresse courriel de l'auteur. On désire l'adresse courriel étudiante.
Definition GOL.h:206
+
Le type représentant une couleur.
Definition GOL.h:164
+
ColorChannelType green
Le canal de couleur verte.
Definition GOL.h:166
+
ColorChannelType red
Le canal de couleur rouge.
Definition GOL.h:165
+
ColorChannelType blue
Le canal de couleur bleue.
Definition GOL.h:167
+
Le type représentant les informations documentant l'implémentation.
Definition GOL.h:218
+
std::string title
Le titre de l'implémentation.
Definition GOL.h:219
+
std::vector< Author > authors
Les auteurs de l'implémentation.
Definition GOL.h:220
+
std::vector< std::string > optionnalComments
Des commentaires optionnels.
Definition GOL.h:222
+
std::vector< std::string > answers
Les réponses aux questions du laboratoire.
Definition GOL.h:221
+
Le type représentant des données statistiques de la simulation.
Definition GOL.h:186
+
std::optional< size_t > totalDeadAbs
Le nombre total de cellules mortes en valeur absolue.
Definition GOL.h:193
+
std::optional< float > totalDeadRel
Le nombre total de cellules mortes en valeur relative du nombre total de cellules.
Definition GOL.h:195
+
std::optional< size_t > width
La largeur de la grille.
Definition GOL.h:189
+
std::optional< IterationType > iteration
Le nombre d'itération de la simulation.
Definition GOL.h:192
+
std::optional< size_t > totalCells
Le nombre total de cellules.
Definition GOL.h:191
+
std::optional< BorderManagement > borderManagement
La stratégie de gestion de bord.
Definition GOL.h:188
+
std::optional< size_t > totalAliveAbs
Le nombre total de cellules vivantes en valeur absolue.
Definition GOL.h:194
+
std::optional< size_t > height
La hauteur de la grille.
Definition GOL.h:190
+
std::optional< std::string > rule
La règle de la simulation exprimé par la chaîne de caractères de format "B###/S###".
Definition GOL.h:187
+
std::optional< int > tendencyAbs
La tendance de la variation entre le nombre de cellules mortes et vivantes en valeur absolue.
Definition GOL.h:197
+
std::optional< float > tendencyRel
La tendance de la variation entre le nombre de cellules mortes et vivantes en valeur relative.
Definition GOL.h:198
+
std::optional< float > totalAliveRel
Le nombre total de cellules vivantes en valeur relative du nombre total de cellules.
Definition GOL.h:196
+
+ + + + diff --git a/GOLAppLib/doc/html/annotated.html b/GOLAppLib/doc/html/annotated.html new file mode 100644 index 0000000..2bab34b --- /dev/null +++ b/GOLAppLib/doc/html/annotated.html @@ -0,0 +1,92 @@ + + + + + + + +GOL: Class List + + + + + + + + + +
+
+ + + + + + + +
+
GOL +
+
Game Of Life
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Class List
+
+
+
Here are the classes, structs, unions and interfaces with brief descriptions:
+
[detail level 12]
+ + + + + +
 CGOLMoteur de simulation d'un automate cellulaire à 2 dimensions
 CAuthorLe type représentant les informations permettant d'identifier les auteurs de l'implémentation
 CColorLe type représentant une couleur
 CImplementationInformationLe type représentant les informations documentant l'implémentation
 CStatisticsLe type représentant des données statistiques de la simulation
+
+
+ + + + diff --git a/GOLAppLib/doc/html/bc_s.png b/GOLAppLib/doc/html/bc_s.png new file mode 100644 index 0000000..224b29a Binary files /dev/null and b/GOLAppLib/doc/html/bc_s.png differ diff --git a/GOLAppLib/doc/html/bc_sd.png b/GOLAppLib/doc/html/bc_sd.png new file mode 100644 index 0000000..31ca888 Binary files /dev/null and b/GOLAppLib/doc/html/bc_sd.png differ diff --git a/GOLAppLib/doc/html/class_g_o_l-members.html b/GOLAppLib/doc/html/class_g_o_l-members.html new file mode 100644 index 0000000..1377e93 --- /dev/null +++ b/GOLAppLib/doc/html/class_g_o_l-members.html @@ -0,0 +1,114 @@ + + + + + + + +GOL: Member List + + + + + + + + + +
+
+ + + + + + + +
+
GOL +
+
Game Of Life
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+
GOL Member List
+
+
+ +

This is the complete list of members for GOL, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
BorderManagement enum nameGOL
borderManagement() const =0GOLpure virtual
color(State state) const =0GOLpure virtual
ColorChannelType typedefGOL
fill(State state=State::dead)=0GOLpure virtual
fillAlternately(State firstCell=State::dead)=0GOLpure virtual
GOL()=defaultGOL
GOL(size_t width, size_t height, State defaultState=State::dead)GOLinline
height() const =0GOLpure virtual
information() const =0GOLpure virtual
IterationType typedefGOL
processOneStep()=0GOLpure virtual
randomize(double percentAlive=0.5)=0GOLpure virtual
resize(size_t width, size_t height, State defaultState=State::dead)=0GOLpure virtual
rule() const =0GOLpure virtual
setBorderManagement(BorderManagement borderManagement)=0GOLpure virtual
setFromPattern(std::string const &pattern, int centerX, int centerY)=0GOLpure virtual
setFromPattern(std::string const &pattern)=0GOLpure virtual
setRule(std::string const &rule)=0GOLpure virtual
setSolidColor(State state, Color const &color)=0GOLpure virtual
setState(int x, int y, State state)=0GOLpure virtual
size() const =0GOLpure virtual
State enum nameGOL
state(int x, int y) const =0GOLpure virtual
statistics() const =0GOLpure virtual
updateImage(uint32_t *buffer, size_t buffer_size) const =0GOLpure virtual
width() const =0GOLpure virtual
~GOL()=defaultGOLvirtual
+ + + + diff --git a/GOLAppLib/doc/html/class_g_o_l.html b/GOLAppLib/doc/html/class_g_o_l.html new file mode 100644 index 0000000..8724a28 --- /dev/null +++ b/GOLAppLib/doc/html/class_g_o_l.html @@ -0,0 +1,1246 @@ + + + + + + + +GOL: GOL Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
GOL +
+
Game Of Life
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+
+Classes | +Public Types | +Public Member Functions | +List of all members
+
GOL Class Referenceabstract
+
+
+ +

Moteur de simulation d'un automate cellulaire à 2 dimensions. + More...

+ +

#include <GOL.h>

+ + + + + + + + + + + + + + +

+Classes

struct  Author
 Le type représentant les informations permettant d'identifier les auteurs de l'implémentation. More...
 
struct  Color
 Le type représentant une couleur. More...
 
struct  ImplementationInformation
 Le type représentant les informations documentant l'implémentation. More...
 
struct  Statistics
 Le type représentant des données statistiques de la simulation. More...
 
+ + + + + + + + + + + + + +

+Public Types

enum class  State : uint8_t { dead = 0 +, alive = 1 + }
 Le type représentant l'état d'une cellule. More...
 
enum class  BorderManagement : uint8_t {
+  immutableAsIs = 0 +, foreverDead +, foreverAlive +, warping +,
+  mirror +
+ }
 Le type représentant la stratégie de gestion de bord. More...
 
using IterationType = uint32_t
 Le type représentant le nombre d'itération de la simulation.
 
using ColorChannelType = uint8_t
 Le type représentant un canal de couleur.
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

GOL ()=default
 Constructeur par défaut.
 
GOL (size_t width, size_t height, State defaultState=State::dead)
 Constructeur d'initialisation personnalisé.
 
+virtual ~GOL ()=default
 Destructeur.
 
virtual size_t width () const =0
 Accesseur retournant la largeur de la grille de simualtion.
 
virtual size_t height () const =0
 Accesseur retournant la hauteur de la grille de simualtion.
 
virtual size_t size () const =0
 Accesseur retournant le nombre total de cellules de la grille de simualtion.
 
virtual State state (int x, int y) const =0
 Accesseur retournant l'état d'une cellule.
 
virtual std::string rule () const =0
 Accesseur retournant la chaîne de caractères correspondant à la règle courante.
 
virtual BorderManagement borderManagement () const =0
 Accesseur retournant la stratégie courante de gestion des bords.
 
virtual Color color (State state) const =0
 Accesseur retournant la couleur d'un état.
 
virtual Statistics statistics () const =0
 Accesseurs retournant des informations générales sur la simulation en cours.
 
virtual ImplementationInformation information () const =0
 Accesseurs retournant les informations sur la réalisation de l'implémentation.
 
virtual void resize (size_t width, size_t height, State defaultState=State::dead)=0
 Mutateur modifiant la taille de la grille de simulation.
 
virtual bool setRule (std::string const &rule)=0
 Mutateur modifiant la règle de la simulation.
 
virtual void setBorderManagement (BorderManagement borderManagement)=0
 Mutateur modifiant la stratégie de gestion de bord.
 
virtual void setState (int x, int y, State state)=0
 Mutateur modifiant l'état d'une cellule de la grille.
 
virtual void fill (State state=State::dead)=0
 Mutateur remplissant de façon uniforme toutes les cellules de la grille.
 
virtual void fillAlternately (State firstCell=State::dead)=0
 Mutateur remplissant de façon alternée toutes les cellules de la grille.
 
virtual void randomize (double percentAlive=0.5)=0
 Mutateur remplissant de façon aléatoire toutes les cellules de la grille.
 
virtual bool setFromPattern (std::string const &pattern, int centerX, int centerY)=0
 Mutateur remplissant la grille par le patron passé en argument.
 
virtual bool setFromPattern (std::string const &pattern)=0
 Mutateur remplissant la grille par le patron passé en argument.
 
virtual void setSolidColor (State state, Color const &color)=0
 Mutateur modifiant la couleur d'un état.
 
virtual void processOneStep ()=0
 Fonction effectuant une itération de la simulation.
 
virtual void updateImage (uint32_t *buffer, size_t buffer_size) const =0
 Fonction dessinant l'état de la simulation sur une image passée en paramètre.
 
+

Detailed Description

+

Moteur de simulation d'un automate cellulaire à 2 dimensions.

+

La classe GOL représente une interface standardisée visant l'implémentation complète et suffisante d'un engin de simulation d'un automate cellulaire à 2 dimensions.

+

Cette classe abstraite ne fait rien et ne possède aucun attribut. Elle ne constitue qu'un modèle standardisé pouvant être facilement utilisé pour réaliser une simulation.

+

La classe possède :

+

L'approche utilisée est donc un parfait exemple d'un développement modulaire s'appuyant sur le polymorphisme. Néanmoins, pour rester critique, cette classe présente un défaut de conception du fait qu'elle réalise beaucoup trop de tâches à elle seule. Un découpage mieux structuré serait préférable considérant un projet d'envergure. La forme actuelle de cette conception vise à mettre l'emphase du développement sur les objetifs du projet sans être dérangé par d'autres aspects : conception et implémentation de structures de données et d'algorithmes.

+

Puisque cette classe est abstraite, elle est destiné à être héritée afin que vous implémentiez entièrement un engin de type automate cellulaire répondant strictement à l'interface présentée.

+

Éléments importants :

+

Member Typedef Documentation

+ +

◆ ColorChannelType

+ +
+
+ + + + +
using GOL::ColorChannelType = uint8_t
+
+ +

Le type représentant un canal de couleur.

+

Le type choisi est un entier non signé de 8 bits.

+ +
+
+ +

◆ IterationType

+ +
+
+ + + + +
using GOL::IterationType = uint32_t
+
+ +

Le type représentant le nombre d'itération de la simulation.

+

Le type choisi est un entier non signé de 32 bits.

+ +
+
+

Member Enumeration Documentation

+ +

◆ BorderManagement

+ +
+
+ + + + + +
+ + + + +
enum class GOL::BorderManagement : uint8_t
+
+strong
+
+ +

Le type représentant la stratégie de gestion de bord.

+

L'algorithme de simulation doit gérer les effets de bord. C'est-à-dire que les calculs de voisinage doivent être adaptés pour les cellules situées sur les bords de la grille.

+

5 modes de gestion sont possibles.

+ + + + + + +
Enumerator
immutableAsIs 

Les cellules du contour ne sont jamais modifiées. Elles sont laissées dans leur état courant.

+
foreverDead 

Les cellules du contour ne sont jamais modifiées. Elles sont toujours mortes.

+
foreverAlive 

Les cellules du contour ne sont jamais modifiées. Elles sont toujours vivantes.

+
warping 

Les cellules du contour sont évaluées. On utilise les cellules du côté opposé de la grille pour les cellules extérieures.

+
mirror 

Les cellules du contour sont évaluées. On utilise les cellules du côté opposé de la cellule pour les cellules extérieures.

+
+ +
+
+ +

◆ State

+ +
+
+ + + + + +
+ + + + +
enum class GOL::State : uint8_t
+
+strong
+
+ +

Le type représentant l'état d'une cellule.

+

L'état d'une cellule peut être mort ou vivant.

+ + + +
Enumerator
dead 

L'état mort.

+
alive 

L'état vivant.

+
+ +
+
+

Member Function Documentation

+ +

◆ borderManagement()

+ +
+
+ + + + + +
+ + + + + + + +
virtual BorderManagement GOL::borderManagement () const
+
+pure virtual
+
+ +

Accesseur retournant la stratégie courante de gestion des bords.

+
Returns
La stratégie courante de gestion des bords.
+ +
+
+ +

◆ color()

+ +
+
+ + + + + +
+ + + + + + + + +
virtual Color GOL::color (State state) const
+
+pure virtual
+
+ +

Accesseur retournant la couleur d'un état.

+

Cette fonction retourne la couleur associée à l'état passé en argument.

+
Parameters
+ + +
stateL'état dont on veut connaître la couleur.
+
+
+
Returns
La couleur associée à l'état.
+ +
+
+ +

◆ fill()

+ +
+
+ + + + + +
+ + + + + + + + +
virtual void GOL::fill (State state = State::dead)
+
+pure virtual
+
+ +

Mutateur remplissant de façon uniforme toutes les cellules de la grille.

+

Cette fonction remplit toutes les cellules de la grille avec l'état passé en argument.

+

L'itération courante est remise à 0.

+
Parameters
+ + +
stateL'état d'initialisation des cellules.
+
+
+ +
+
+ +

◆ fillAlternately()

+ +
+
+ + + + + +
+ + + + + + + + +
virtual void GOL::fillAlternately (State firstCell = State::dead)
+
+pure virtual
+
+ +

Mutateur remplissant de façon alternée toutes les cellules de la grille.

+

Cette fonction remplit toutes les cellules de la grille avec un motif en damier. La première cellule, en haut à gauche, est de l'état passée en argument.

+

L'itération courante est remise à 0.

+
Parameters
+ + +
firstCellL'état de la première cellule.
+
+
+ +
+
+ +

◆ height()

+ +
+
+ + + + + +
+ + + + + + + +
virtual size_t GOL::height () const
+
+pure virtual
+
+ +

Accesseur retournant la hauteur de la grille de simualtion.

+
Returns
La hauteur de la grille.
+ +
+
+ +

◆ information()

+ +
+
+ + + + + +
+ + + + + + + +
virtual ImplementationInformation GOL::information () const
+
+pure virtual
+
+ +

Accesseurs retournant les informations sur la réalisation de l'implémentation.

+

Retourne plusieurs informations sur la réalisation de l'implémentation. Chaque valeur est optionnelle et peut être indéterminée.

+

En quelque sorte, c'est l'approche utilisée pour produire un mini rapport utilitaire.

+

Voir la documentation liée à la structure ImplementationInformation pour plus de détails.

+

Pour les réponses 'answers', l'objectif est d'utiliser clairement le vocabulaire technique approprié tout en étant très concis et très précis.

+
Returns
Une structure contenant les informations sur la réalisation
+ +
+
+ +

◆ processOneStep()

+ +
+
+ + + + + +
+ + + + + + + +
virtual void GOL::processOneStep ()
+
+pure virtual
+
+ +

Fonction effectuant une itération de la simulation.

+

Cette fonction constitue la partie centrale de la simulation. Elle est responsable de faire évoluer la grille d'une itération.

+

Cette fonction doit appliquer la logique de l'automate cellulaire en tenant compte pour chaque cellule :

    +
  • de la grille
  • +
  • de l'état de chacune des cellules voisines
  • +
  • de la règle de la simulation
  • +
  • de la stratégie de gestion de bord
  • +
+

Après l'appel de cette fonction, la grille est mise à jour avec le nouvel état de chaque cellule suivant l'état précédent. Les statistiques doivent tenir compte de cette évolution.

+ +
+
+ +

◆ randomize()

+ +
+
+ + + + + +
+ + + + + + + + +
virtual void GOL::randomize (double percentAlive = 0.5)
+
+pure virtual
+
+ +

Mutateur remplissant de façon aléatoire toutes les cellules de la grille.

+

Cette fonction remplit toutes les cellules de la grille avec un motif aléatoire. Le pourcentage de probabilité d'une cellule d'être vivante est passé en argument.

+

L'itération courante est remise à 0.

+
Parameters
+ + +
percentAliveLe pourcentage de probabilité d'une cellule d'être vivante. La valeur doit être comprise entre 0.0 et 1.0 inclusivement.
+
+
+ +
+
+ +

◆ resize()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
virtual void GOL::resize (size_t width,
size_t height,
State defaultState = State::dead 
)
+
+pure virtual
+
+ +

Mutateur modifiant la taille de la grille de simulation.

+

Cette fonction réinitialise la taille et le contenu de la grille. La taille est spécifié peut être 0 x 0. Le contenu de la grille est entièrement mis à l'état passé en argument.

+

Cette fonction s'assure que si l'une des dimensions est 0, alors les deux sont mises à 0.

+

L'ancient motif de la grille est perdu. L'itération courante est remise à 0.

+
Parameters
+ + + + +
widthLa nouvelle largeur de la grille.
heightLa nouvelle hauteur de la grille.
defaultStateL'état d'initialisation des cellules.
+
+
+ +
+
+ +

◆ rule()

+ +
+
+ + + + + +
+ + + + + + + +
virtual std::string GOL::rule () const
+
+pure virtual
+
+ +

Accesseur retournant la chaîne de caractères correspondant à la règle courante.

+

La chaîne de caractères est de la forme "B###/S###".

+
Returns
La chaîne de caractères correspondant à la règle courante selon le format B###.../S###....
+ +
+
+ +

◆ setBorderManagement()

+ +
+
+ + + + + +
+ + + + + + + + +
virtual void GOL::setBorderManagement (BorderManagement borderManagement)
+
+pure virtual
+
+ +

Mutateur modifiant la stratégie de gestion de bord.

+

Cette fonction assigne la nouvelle stratégie pour que les prochaines évolutions l'utilisent.

+

L'ancienne stratégie est perdue. L'itération courante est remise à 0.

+

Vous devez être en mesure de gérer les effets de bord selon 5 stratégies différentes :
+

    +
  • BorderManagement::immutableAsIs : immuable tel quel. Les cellules du contour ne sont jamais modifiées.
  • +
  • BorderManagement::foreverDead : mort pour toujours. Les cellules du contour ne sont jamais modifiées, elles sont toujours mortes.
  • +
  • BorderManagement::foreverAlive : vivant pour toujours. Les cellules du contour ne sont jamais modifiées, elles sont toujours vivantes.
  • +
  • BorderManagement::warping : téléportation. Les cellules du contour sont évaluées. On utilise les cellules du côté opposé de la grille pour les cellules extérieures.
  • +
  • BorderManagement::mirror : miroir. Les cellules du contour sont évaluées. On utilise les cellules du côté opposé de la cellule pour les cellules extérieures.
  • +
+

Pour les 2 exemples suivants, la cellule analysée -*- possède 3 voisins situés à l'extérieur de la grille 'x', 'y' et 'z'. Ces cellules sont substituées par les voisins opposés 'X', 'Y' et 'Z'.

+

BorderManagement::warping utilise les voisins opposés par rapport à la grille.

+
+    +---+---+---+---+---+ 
+  x |   |   |   |   | X |
+    +---+---+---+---+---+
+  y |-*-|   |   |   | Y |
+    +---+---+---+---+---+
+  z |   |   |   |   | Z |
+

BorderManagement::mirror utilise les voisins opposés par rapport à la cellule.

+
+    +---+---+---+---+---+ 
+  x |   | X |   |   |   |
+    +---+---+---+---+---+
+  y |-*-| Y |   |   |   |
+    +---+---+---+---+---+
+  z |   | Z |   |   |   |
+
Parameters
+ + +
borderManagementLa nouvelle stratégie de gestion de bord.
+
+
+ +
+
+ +

◆ setFromPattern() [1/2]

+ +
+
+ + + + + +
+ + + + + + + + +
virtual bool GOL::setFromPattern (std::string const & pattern)
+
+pure virtual
+
+ +

Mutateur remplissant la grille par le patron passé en argument.

+

Cette fonction est une surcharge utilitaire de la fonction setFromPattern(std::string const & pattern, int centerX, int centerY). Cette version utilise le centre de la grille comme centre du patron.

+

L'itération courante est remise à 0.

+
Parameters
+ + +
patternLe patron à appliquer.
+
+
+
Returns
true si le patron est valide, false sinon.
+ +
+
+ +

◆ setFromPattern() [2/2]

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
virtual bool GOL::setFromPattern (std::string const & pattern,
int centerX,
int centerY 
)
+
+pure virtual
+
+ +

Mutateur remplissant la grille par le patron passé en argument.

+

Cette fonction remplit la grille avec le patron donné. Le patron est centré sur la coordonnées (centerX, centerY).

+

Le patron respecte un format précis. Se référer à l'énoncé pour voir tous les détails.

+

Si le patron n'est pas valide, la grille n'est pas modifiée et on retourne false. Sinon, on retourne vrai.

+

L'itération courante est remise à 0.

+
Parameters
+ + + + +
patternLe patron à appliquer.
centerXLa coordonnée en x de la grille où se trouve centré le patron.
centerYLa coordonnée en y de la grille où se trouve centré le patron.
+
+
+
Returns
true si le patron est valide, false sinon.
+ +
+
+ +

◆ setRule()

+ +
+
+ + + + + +
+ + + + + + + + +
virtual bool GOL::setRule (std::string const & rule)
+
+pure virtual
+
+ +

Mutateur modifiant la règle de la simulation.

+

Cette fonction s'assure que la chaîne de caractères est valide et assigne la nouvelle règle pour que les prochaines évolutions l'utilisent.

+

Si la règle est valide, on assigne la novuelle règle, l'ancienne règle est perdue et l'itération courante est remise à 0. Si la règle est invalide, on ne fait rien.

+

La simulation doit être en mesure de supporté les règles valides.

+

Les règles sont définies par une chaîne de caractère suivant ce format: B###.../S###..., par exemple : B3/S23.

    +
  • La lettre B (minuscule ou majuscule) débute la section 'B'orn concernant les états morts qui naissent
  • +
  • Suit une série de n caractères pouvant contenir une instance de chacun de ces caractères : '0', '1', '2', '3', '4', '5', '6', '7', '8'. La valeur de n peut varier de 0 à 9. Cette séquence indique toutes les combinaisons du nombre de cellules voisines vivantes qui font naître une cellule morte.
  • +
  • Le caractère barre oblique / (slash) qui indique la transition vers la section suivante.
  • +
  • La lettre S (minuscule ou majuscule) débute la section 'S'urvive concernant les états vivants qui survivent (qui restent vivantes).
  • +
  • Suit une série de n caractères pouvant contenir une instance de chacun de ces caractères : '0', '1', '2', '3', '4', '5', '6', '7', '8'. La valeur de n peut varier de 0 à 9. Cette séquence indique toutes les combinaisons du nombre de cellules voisines vivantes qui font naître une cellule morte.
  • +
+

Par exemple : B02/S1357 indique que :

    +
  • si une cellule est morte :
      +
    • elle naît se elle possède 0 ou 2 voisins vivants
    • +
    +
  • +
  • si la cellule est vivante :
      +
    • elle survie si elle possède 1, 3, 5 ou 7 voisins vivants
    • +
    +
  • +
+

La règle de Conway B3/S23 est celle par défaut.

+ +
+
+ +

◆ setSolidColor()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
virtual void GOL::setSolidColor (State state,
Color const & color 
)
+
+pure virtual
+
+ +

Mutateur modifiant la couleur d'un état.

+

Cette fonction modifie la couleur d'un état.

+

Formellement, cette fonction ne modifie rien en soit mais plutôt permet de stocker quelle couleur utiliser pour représenter un état lors de l'affichage de la grille sur une image.

+
Parameters
+ + + +
stateL'état dont on veut modifier la couleur.
colorLa nouvelle couleur de l'état.
+
+
+ +
+
+ +

◆ setState()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
virtual void GOL::setState (int x,
int y,
State state 
)
+
+pure virtual
+
+ +

Mutateur modifiant l'état d'une cellule de la grille.

+

Cette fonction ne valide pas les entrées pour une raison de performance. L'origine est le coin supérieur gauche de la grille.

+
Parameters
+ + + + +
xLa coordonnée en x de la cellule.
yLa coordonnée en y de la cellule.
stateLe nouvel état de la cellule.
+
+
+ +
+
+ +

◆ size()

+ +
+
+ + + + + +
+ + + + + + + +
virtual size_t GOL::size () const
+
+pure virtual
+
+ +

Accesseur retournant le nombre total de cellules de la grille de simualtion.

+
Returns
Le nombre total de cellules de la grille.
+ +
+
+ +

◆ state()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
virtual State GOL::state (int x,
int y 
) const
+
+pure virtual
+
+ +

Accesseur retournant l'état d'une cellule.

+

Cette fonction ne valide pas les entrées pour une raison de performance. L'origine est le coin supérieur gauche de la grille.

+
Parameters
+ + + +
xLa coordonnée en x de la cellule.
yLa coordonnée en y de la cellule.
+
+
+
Returns
L'état de la cellule.
+ +
+
+ +

◆ statistics()

+ +
+
+ + + + + +
+ + + + + + + +
virtual Statistics GOL::statistics () const
+
+pure virtual
+
+ +

Accesseurs retournant des informations générales sur la simulation en cours.

+

Retourne plusieurs informations sur la simulation. Chaque valeur est optionnelle et peut être indéterminée.

+

Voir la documentation liée à la structure Statistics pour plus de détails.

+

Toutefois, les tendances sont définies ainsi :

    +
  • La tendance indique la variation entre le nombre de cellules mortes et vivantes en valeur absolue et relative.
  • +
  • Une tendance est à la hausse s'il y a plus de cellules naissantes que mourantes.
  • +
  • Un premier caractères indique si la tendance est à la hausse (+) ou à la baisse (-).
  • +
  • La tendance doit se faire sur un certain nombre d'itérations. Ce nombre est défini par l'implémentation mais doit être supérieur à 10 itérations. L'objectif est d'avoir une lecture relativement stable de la tendance afin qu'elle soit agréable à lire dans l'interface usager.
  • +
  • Optionnellement, vous pouvez ajouter un second caractère indiquant la stabilité de la tendance. Voici la légende :
      +
    • '-' : stable
    • +
    • '~' : légèrement instable
    • +
    • 'w' : instable
    • +
    • 'W' : très instable
    • +
    +
  • +
+
Returns
Une structure contenant les informations sur la simulation.
+ +
+
+ +

◆ updateImage()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
virtual void GOL::updateImage (uint32_t * buffer,
size_t buffer_size 
) const
+
+pure virtual
+
+ +

Fonction dessinant l'état de la simulation sur une image passée en paramètre.

+

Cette fonction dessine l'état courant de chaque cellule sur l'image donnée. Chaque pixel de l'image correspond à une cellule de la grille de simulation.

+

La couleur de chaque pixel est déterminée par la couleur associée à l'état de la cellule.

+

L'organisation en mémoire est ce qu'on appel 'Packed Pixel' suivant l'ordre ARGB. Ainsi, toutes les données d'un pixel est contiguë en mémoire. Les 4 canaux de couleurs sont stockés dans un entier non signé de 32 bits. Chaque canal est codé sur 8 bits. Le canal alpha est le plus significatif et le canal bleu est le moins significatif.

+

La variable buffer pointe vers un tableau de pixels de taille buffer_size. La taille de l'image est donc buffer_size / sizeof(uint32_t).

+
+[           32 bits            ]
+[8 bits][8 bits][8 bits][8 bits]
+[alpha ][red   ][green ][blue  ]
+[alpha ][rouge ][vert  ][bleu  ]
+

Vous pouvez considérer que l'image a été créée avec le format de Qt QImage::Format_ARGB32.

+

Il est attendu que vous fassiez une validation minimum des intrants.

+
Parameters
+ + + +
bufferLe tableau de pixels de l'image.
buffer_sizeLa taille du tableau de pixels.
+
+
+ +
+
+ +

◆ width()

+ +
+
+ + + + + +
+ + + + + + + +
virtual size_t GOL::width () const
+
+pure virtual
+
+ +

Accesseur retournant la largeur de la grille de simualtion.

+
Returns
La largeur de la grille.
+ +
+
+
+ + + + diff --git a/GOLAppLib/doc/html/classes.html b/GOLAppLib/doc/html/classes.html new file mode 100644 index 0000000..3632ddc --- /dev/null +++ b/GOLAppLib/doc/html/classes.html @@ -0,0 +1,101 @@ + + + + + + + +GOL: Class Index + + + + + + + + + +
+
+ + + + + + + +
+
GOL +
+
Game Of Life
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Class Index
+
+
+
A | C | G | I | S
+
+
+
A
+
GOL::Author
+
+
C
+
GOL::Color
+
+
G
+
GOL
+
+
I
+
GOL::ImplementationInformation
+
+
S
+
GOL::Statistics
+
+
+ + + + diff --git a/GOLAppLib/doc/html/closed.png b/GOLAppLib/doc/html/closed.png new file mode 100644 index 0000000..98cc2c9 Binary files /dev/null and b/GOLAppLib/doc/html/closed.png differ diff --git a/GOLAppLib/doc/html/doc.svg b/GOLAppLib/doc/html/doc.svg new file mode 100644 index 0000000..0b928a5 --- /dev/null +++ b/GOLAppLib/doc/html/doc.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/GOLAppLib/doc/html/docd.svg b/GOLAppLib/doc/html/docd.svg new file mode 100644 index 0000000..ac18b27 --- /dev/null +++ b/GOLAppLib/doc/html/docd.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/GOLAppLib/doc/html/doxygen.css b/GOLAppLib/doc/html/doxygen.css new file mode 100644 index 0000000..009a9b5 --- /dev/null +++ b/GOLAppLib/doc/html/doxygen.css @@ -0,0 +1,2045 @@ +/* The standard CSS for doxygen 1.9.8*/ + +html { +/* page base colors */ +--page-background-color: white; +--page-foreground-color: black; +--page-link-color: #3D578C; +--page-visited-link-color: #4665A2; + +/* index */ +--index-odd-item-bg-color: #F8F9FC; +--index-even-item-bg-color: white; +--index-header-color: black; +--index-separator-color: #A0A0A0; + +/* header */ +--header-background-color: #F9FAFC; +--header-separator-color: #C4CFE5; +--header-gradient-image: url('nav_h.png'); +--group-header-separator-color: #879ECB; +--group-header-color: #354C7B; +--inherit-header-color: gray; + +--footer-foreground-color: #2A3D61; +--footer-logo-width: 104px; +--citation-label-color: #334975; +--glow-color: cyan; + +--title-background-color: white; +--title-separator-color: #5373B4; +--directory-separator-color: #9CAFD4; +--separator-color: #4A6AAA; + +--blockquote-background-color: #F7F8FB; +--blockquote-border-color: #9CAFD4; + +--scrollbar-thumb-color: #9CAFD4; +--scrollbar-background-color: #F9FAFC; + +--icon-background-color: #728DC1; +--icon-foreground-color: white; +--icon-doc-image: url('doc.svg'); +--icon-folder-open-image: url('folderopen.svg'); +--icon-folder-closed-image: url('folderclosed.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #F9FAFC; +--memdecl-separator-color: #DEE4F0; +--memdecl-foreground-color: #555; +--memdecl-template-color: #4665A2; + +/* detailed member list */ +--memdef-border-color: #A8B8D9; +--memdef-title-background-color: #E2E8F2; +--memdef-title-gradient-image: url('nav_f.png'); +--memdef-proto-background-color: #DFE5F1; +--memdef-proto-text-color: #253555; +--memdef-proto-text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--memdef-doc-background-color: white; +--memdef-param-name-color: #602020; +--memdef-template-color: #4665A2; + +/* tables */ +--table-cell-border-color: #2D4068; +--table-header-background-color: #374F7F; +--table-header-foreground-color: #FFFFFF; + +/* labels */ +--label-background-color: #728DC1; +--label-left-top-border-color: #5373B4; +--label-right-bottom-border-color: #C4CFE5; +--label-foreground-color: white; + +/** navigation bar/tree/menu */ +--nav-background-color: #F9FAFC; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_b.png'); +--nav-gradient-hover-image: url('tab_h.png'); +--nav-gradient-active-image: url('tab_a.png'); +--nav-gradient-active-image-parent: url("../tab_a.png"); +--nav-separator-image: url('tab_s.png'); +--nav-breadcrumb-image: url('bc_s.png'); +--nav-breadcrumb-border-color: #C2CDE4; +--nav-splitbar-image: url('splitbar.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #283A5D; +--nav-text-hover-color: white; +--nav-text-active-color: white; +--nav-text-normal-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #364D7C; +--nav-menu-background-color: white; +--nav-menu-foreground-color: #555555; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.5); +--nav-arrow-color: #9CAFD4; +--nav-arrow-selected-color: #9CAFD4; + +/* table of contents */ +--toc-background-color: #F4F6FA; +--toc-border-color: #D8DFEE; +--toc-header-color: #4665A2; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: white; +--search-foreground-color: #909090; +--search-magnification-image: url('mag.svg'); +--search-magnification-select-image: url('mag_sel.svg'); +--search-active-color: black; +--search-filter-background-color: #F9FAFC; +--search-filter-foreground-color: black; +--search-filter-border-color: #90A5CE; +--search-filter-highlight-text-color: white; +--search-filter-highlight-bg-color: #3D578C; +--search-results-foreground-color: #425E97; +--search-results-background-color: #EEF1F7; +--search-results-border-color: black; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #555; + +/** code fragments */ +--code-keyword-color: #008000; +--code-type-keyword-color: #604020; +--code-flow-keyword-color: #E08000; +--code-comment-color: #800000; +--code-preprocessor-color: #806020; +--code-string-literal-color: #002080; +--code-char-literal-color: #008080; +--code-xml-cdata-color: black; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #000000; +--code-vhdl-keyword-color: #700070; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #4665A2; +--code-external-link-color: #4665A2; +--fragment-foreground-color: black; +--fragment-background-color: #FBFCFD; +--fragment-border-color: #C4CFE5; +--fragment-lineno-border-color: #00FF00; +--fragment-lineno-background-color: #E8E8E8; +--fragment-lineno-foreground-color: black; +--fragment-lineno-link-fg-color: #4665A2; +--fragment-lineno-link-bg-color: #D8D8D8; +--fragment-lineno-link-hover-fg-color: #4665A2; +--fragment-lineno-link-hover-bg-color: #C8C8C8; +--tooltip-foreground-color: black; +--tooltip-background-color: white; +--tooltip-border-color: gray; +--tooltip-doc-color: grey; +--tooltip-declaration-color: #006318; +--tooltip-link-color: #4665A2; +--tooltip-shadow: 1px 1px 7px gray; +--fold-line-color: #808080; +--fold-minus-image: url('minus.svg'); +--fold-plus-image: url('plus.svg'); +--fold-minus-image-relpath: url('../../minus.svg'); +--fold-plus-image-relpath: url('../../plus.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +} + +@media (prefers-color-scheme: dark) { + html:not(.dark-mode) { + color-scheme: dark; + +/* page base colors */ +--page-background-color: black; +--page-foreground-color: #C9D1D9; +--page-link-color: #90A5CE; +--page-visited-link-color: #A3B4D7; + +/* index */ +--index-odd-item-bg-color: #0B101A; +--index-even-item-bg-color: black; +--index-header-color: #C4CFE5; +--index-separator-color: #334975; + +/* header */ +--header-background-color: #070B11; +--header-separator-color: #141C2E; +--header-gradient-image: url('nav_hd.png'); +--group-header-separator-color: #283A5D; +--group-header-color: #90A5CE; +--inherit-header-color: #A0A0A0; + +--footer-foreground-color: #5B7AB7; +--footer-logo-width: 60px; +--citation-label-color: #90A5CE; +--glow-color: cyan; + +--title-background-color: #090D16; +--title-separator-color: #354C79; +--directory-separator-color: #283A5D; +--separator-color: #283A5D; + +--blockquote-background-color: #101826; +--blockquote-border-color: #283A5D; + +--scrollbar-thumb-color: #283A5D; +--scrollbar-background-color: #070B11; + +--icon-background-color: #334975; +--icon-foreground-color: #C4CFE5; +--icon-doc-image: url('docd.svg'); +--icon-folder-open-image: url('folderopend.svg'); +--icon-folder-closed-image: url('folderclosedd.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #0B101A; +--memdecl-separator-color: #2C3F65; +--memdecl-foreground-color: #BBB; +--memdecl-template-color: #7C95C6; + +/* detailed member list */ +--memdef-border-color: #233250; +--memdef-title-background-color: #1B2840; +--memdef-title-gradient-image: url('nav_fd.png'); +--memdef-proto-background-color: #19243A; +--memdef-proto-text-color: #9DB0D4; +--memdef-proto-text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.9); +--memdef-doc-background-color: black; +--memdef-param-name-color: #D28757; +--memdef-template-color: #7C95C6; + +/* tables */ +--table-cell-border-color: #283A5D; +--table-header-background-color: #283A5D; +--table-header-foreground-color: #C4CFE5; + +/* labels */ +--label-background-color: #354C7B; +--label-left-top-border-color: #4665A2; +--label-right-bottom-border-color: #283A5D; +--label-foreground-color: #CCCCCC; + +/** navigation bar/tree/menu */ +--nav-background-color: #101826; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_bd.png'); +--nav-gradient-hover-image: url('tab_hd.png'); +--nav-gradient-active-image: url('tab_ad.png'); +--nav-gradient-active-image-parent: url("../tab_ad.png"); +--nav-separator-image: url('tab_sd.png'); +--nav-breadcrumb-image: url('bc_sd.png'); +--nav-breadcrumb-border-color: #2A3D61; +--nav-splitbar-image: url('splitbard.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #B6C4DF; +--nav-text-hover-color: #DCE2EF; +--nav-text-active-color: #DCE2EF; +--nav-text-normal-shadow: 0px 1px 1px black; +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #B6C4DF; +--nav-menu-background-color: #05070C; +--nav-menu-foreground-color: #BBBBBB; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.2); +--nav-arrow-color: #334975; +--nav-arrow-selected-color: #90A5CE; + +/* table of contents */ +--toc-background-color: #151E30; +--toc-border-color: #202E4A; +--toc-header-color: #A3B4D7; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: black; +--search-foreground-color: #C5C5C5; +--search-magnification-image: url('mag_d.svg'); +--search-magnification-select-image: url('mag_seld.svg'); +--search-active-color: #C5C5C5; +--search-filter-background-color: #101826; +--search-filter-foreground-color: #90A5CE; +--search-filter-border-color: #7C95C6; +--search-filter-highlight-text-color: #BCC9E2; +--search-filter-highlight-bg-color: #283A5D; +--search-results-background-color: #101826; +--search-results-foreground-color: #90A5CE; +--search-results-border-color: #7C95C6; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #2F436C; + +/** code fragments */ +--code-keyword-color: #CC99CD; +--code-type-keyword-color: #AB99CD; +--code-flow-keyword-color: #E08000; +--code-comment-color: #717790; +--code-preprocessor-color: #65CABE; +--code-string-literal-color: #7EC699; +--code-char-literal-color: #00E0F0; +--code-xml-cdata-color: #C9D1D9; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #C0C0C0; +--code-vhdl-keyword-color: #CF53C9; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #79C0FF; +--code-external-link-color: #79C0FF; +--fragment-foreground-color: #C9D1D9; +--fragment-background-color: black; +--fragment-border-color: #30363D; +--fragment-lineno-border-color: #30363D; +--fragment-lineno-background-color: black; +--fragment-lineno-foreground-color: #6E7681; +--fragment-lineno-link-fg-color: #6E7681; +--fragment-lineno-link-bg-color: #303030; +--fragment-lineno-link-hover-fg-color: #8E96A1; +--fragment-lineno-link-hover-bg-color: #505050; +--tooltip-foreground-color: #C9D1D9; +--tooltip-background-color: #202020; +--tooltip-border-color: #C9D1D9; +--tooltip-doc-color: #D9E1E9; +--tooltip-declaration-color: #20C348; +--tooltip-link-color: #79C0FF; +--tooltip-shadow: none; +--fold-line-color: #808080; +--fold-minus-image: url('minusd.svg'); +--fold-plus-image: url('plusd.svg'); +--fold-minus-image-relpath: url('../../minusd.svg'); +--fold-plus-image-relpath: url('../../plusd.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +}} +body { + background-color: var(--page-background-color); + color: var(--page-foreground-color); +} + +body, table, div, p, dl { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 22px; +} + +/* @group Heading Levels */ + +.title { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 28px; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h1.groupheader { + font-size: 150%; +} + +h2.groupheader { + border-bottom: 1px solid var(--group-header-separator-color); + color: var(--group-header-color); + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px var(--glow-color); +} + +dt { + font-weight: bold; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +th p.starttd, th p.intertd, th p.endtd { + font-size: 100%; + font-weight: 700; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.navtab { + padding-right: 15px; + text-align: right; + line-height: 110%; +} + +div.navtab table { + border-spacing: 0; +} + +td.navtab { + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL { + background-image: var(--nav-gradient-active-image); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: var(--index-separator-color); +} + +#main-menu a:focus { + outline: auto; + z-index: 10; + position: relative; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: var(--index-header-color); +} + +.alphachar a:hover, .alphachar a:visited{ + text-decoration: none; +} + +.classindex dl { + padding: 25px; + column-count:1 +} + +.classindex dd { + display:inline-block; + margin-left: 50px; + width: 90%; + line-height: 1.15em; +} + +.classindex dl.even { + background-color: var(--index-even-item-bg-color); +} + +.classindex dl.odd { + background-color: var(--index-odd-item-bg-color); +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: var(--page-link-color); + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: var(--page-visited-link-color); +} + +a:hover { + text-decoration: underline; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: var(--code-link-color); +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: var(--code-external-link-color); +} + +a.code.hl_class { /* style for links to class names in code snippets */ } +a.code.hl_struct { /* style for links to struct names in code snippets */ } +a.code.hl_union { /* style for links to union names in code snippets */ } +a.code.hl_interface { /* style for links to interface names in code snippets */ } +a.code.hl_protocol { /* style for links to protocol names in code snippets */ } +a.code.hl_category { /* style for links to category names in code snippets */ } +a.code.hl_exception { /* style for links to exception names in code snippets */ } +a.code.hl_service { /* style for links to service names in code snippets */ } +a.code.hl_singleton { /* style for links to singleton names in code snippets */ } +a.code.hl_concept { /* style for links to concept names in code snippets */ } +a.code.hl_namespace { /* style for links to namespace names in code snippets */ } +a.code.hl_package { /* style for links to package names in code snippets */ } +a.code.hl_define { /* style for links to macro names in code snippets */ } +a.code.hl_function { /* style for links to function names in code snippets */ } +a.code.hl_variable { /* style for links to variable names in code snippets */ } +a.code.hl_typedef { /* style for links to typedef names in code snippets */ } +a.code.hl_enumvalue { /* style for links to enum value names in code snippets */ } +a.code.hl_enumeration { /* style for links to enumeration names in code snippets */ } +a.code.hl_signal { /* style for links to Qt signal names in code snippets */ } +a.code.hl_slot { /* style for links to Qt slot names in code snippets */ } +a.code.hl_friend { /* style for links to friend names in code snippets */ } +a.code.hl_dcop { /* style for links to KDE3 DCOP names in code snippets */ } +a.code.hl_property { /* style for links to property names in code snippets */ } +a.code.hl_event { /* style for links to event names in code snippets */ } +a.code.hl_sequence { /* style for links to sequence names in code snippets */ } +a.code.hl_dictionary { /* style for links to dictionary names in code snippets */ } + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: visible; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; + list-style-type: none; +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; /*Fixed: fragment lines overlap floating elements*/ + overflow-y: hidden; +} + +pre.fragment { + border: 1px solid var(--fragment-border-color); + background-color: var(--fragment-background-color); + color: var(--fragment-foreground-color); + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: var(--font-family-monospace); + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + color: var(--fragment-foreground-color); + background-color: var(--fragment-background-color); + border: 1px solid var(--fragment-border-color); +} + +div.line { + font-family: var(--font-family-monospace); + font-size: 13px; + min-height: 13px; + line-height: 1.2; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: var(--glow-color); + box-shadow: 0 0 10px var(--glow-color); +} + +span.fold { + margin-left: 5px; + margin-right: 1px; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; + display: inline-block; + width: 12px; + height: 12px; + background-repeat:no-repeat; + background-position:center; +} + +span.lineno { + padding-right: 4px; + margin-right: 9px; + text-align: right; + border-right: 2px solid var(--fragment-lineno-border-color); + color: var(--fragment-lineno-foreground-color); + background-color: var(--fragment-lineno-background-color); + white-space: pre; +} +span.lineno a, span.lineno a:visited { + color: var(--fragment-lineno-link-fg-color); + background-color: var(--fragment-lineno-link-bg-color); +} + +span.lineno a:hover { + color: var(--fragment-lineno-link-hover-fg-color); + background-color: var(--fragment-lineno-link-hover-bg-color); +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + color: var(--page-foreground-color); + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +p.formulaDsp { + text-align: center; +} + +img.dark-mode-visible { + display: none; +} +img.light-mode-visible { + display: none; +} + +img.formulaDsp { + +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; + width: var(--footer-logo-width); +} + +.compoundTemplParams { + color: var(--memdecl-template-color); + font-size: 80%; + line-height: 120%; +} + +/* @group Code Colorization */ + +span.keyword { + color: var(--code-keyword-color); +} + +span.keywordtype { + color: var(--code-type-keyword-color); +} + +span.keywordflow { + color: var(--code-flow-keyword-color); +} + +span.comment { + color: var(--code-comment-color); +} + +span.preprocessor { + color: var(--code-preprocessor-color); +} + +span.stringliteral { + color: var(--code-string-literal-color); +} + +span.charliteral { + color: var(--code-char-literal-color); +} + +span.xmlcdata { + color: var(--code-xml-cdata-color); +} + +span.vhdldigit { + color: var(--code-vhdl-digit-color); +} + +span.vhdlchar { + color: var(--code-vhdl-char-color); +} + +span.vhdlkeyword { + color: var(--code-vhdl-keyword-color); +} + +span.vhdllogic { + color: var(--code-vhdl-logic-color); +} + +blockquote { + background-color: var(--blockquote-background-color); + border-left: 2px solid var(--blockquote-border-color); + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +/* @end */ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid var(--table-cell-border-color); +} + +th.dirtab { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid var(--separator-color); +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: var(--glow-color); + box-shadow: 0 0 15px var(--glow-color); +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: var(--memdecl-background-color); + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: var(--memdecl-foreground-color); +} + +.memSeparator { + border-bottom: 1px solid var(--memdecl-separator-color); + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: var(--memdecl-template-color); + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: var(--memdef-title-gradient-image); + background-repeat: repeat-x; + background-color: var(--memdef-title-background-color); + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: var(--memdef-template-color); + font-weight: normal; + margin-left: 9px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px var(--glow-color); +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 0px 6px 0px; + color: var(--memdef-proto-text-color); + font-weight: bold; + text-shadow: var(--memdef-proto-text-shadow); + background-color: var(--memdef-proto-background-color); + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; +} + +.overload { + font-family: var(--font-family-monospace); + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 10px 2px 10px; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: var(--memdef-doc-background-color); + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: var(--memdef-param-name-color); + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: var(--font-family-monospace); + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: var(--label-background-color); + border-top:1px solid var(--label-left-top-border-color); + border-left:1px solid var(--label-left-top-border-color); + border-right:1px solid var(--label-right-bottom-border-color); + border-bottom:1px solid var(--label-right-bottom-border-color); + text-shadow: none; + color: var(--label-foreground-color); + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid var(--directory-separator-color); + border-bottom: 1px solid var(--directory-separator-color); + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.odd { + padding-left: 6px; + background-color: var(--index-odd-item-bg-color); +} + +.directory tr.even { + padding-left: 6px; + background-color: var(--index-even-item-bg-color); +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: var(--page-link-color); +} + +.arrow { + color: var(--nav-arrow-color); + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: var(--font-family-icon); + line-height: normal; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: var(--icon-background-color); + color: var(--icon-foreground-color); + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-open-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-closed-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-doc-image); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: var(--footer-foreground-color); +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + margin-bottom: 10px; + border: 1px solid var(--memdef-border-color); + border-spacing: 0px; + border-radius: 4px; + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid var(--memdef-border-color); + border-bottom: 1px solid var(--memdef-border-color); + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid var(--memdef-border-color); +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image: var(--memdef-title-gradient-image); + background-repeat:repeat-x; + background-color: var(--memdef-title-background-color); + font-size: 90%; + color: var(--memdef-proto-text-color); + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid var(--memdef-border-color); +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: var(--nav-gradient-image); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image: var(--nav-gradient-image); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:var(--nav-text-normal-color); + border:solid 1px var(--nav-breadcrumb-border-color); + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:var(--nav-breadcrumb-image); + background-repeat:no-repeat; + background-position:right; + color: var(--nav-foreground-color); +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: var(--nav-text-normal-color); + font-family: var(--font-family-nav); + text-shadow: var(--nav-text-normal-shadow); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color: var(--footer-foreground-color); + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image: var(--header-gradient-image); + background-repeat:repeat-x; + background-color: var(--header-background-color); + margin: 0px; + border-bottom: 1px solid var(--header-separator-color); +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectrow +{ + height: 56px; +} + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; + padding-left: 0.5em; +} + +#projectname +{ + font-size: 200%; + font-family: var(--font-family-title); + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font-size: 90%; + font-family: var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font-size: 50%; + font-family: 50% var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid var(--title-separator-color); + background-color: var(--title-background-color); +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:var(--citation-label-color); + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; + text-align:right; + width:52px; +} + +dl.citelist dd { + margin:2px 0 2px 72px; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: var(--toc-background-color); + border: 1px solid var(--toc-border-color); + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +div.toc li { + background: var(--toc-down-arrow-image) no-repeat scroll 0 5px transparent; + font: 10px/1.2 var(--font-family-toc); + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +div.toc h3 { + font: bold 12px/1.2 var(--font-family-toc); + color: var(--toc-header-color); + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 15px; +} + +div.toc li.level4 { + margin-left: 15px; +} + +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + +span.obfuscator { + display: none; +} + +.inherit_header { + font-weight: bold; + color: var(--inherit-header-color); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + /*white-space: nowrap;*/ + color: var(--tooltip-foreground-color); + background-color: var(--tooltip-background-color); + border: 1px solid var(--tooltip-border-color); + border-radius: 4px 4px 4px 4px; + box-shadow: var(--tooltip-shadow); + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: var(--tooltip-doc-color); + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip a { + color: var(--tooltip-link-color); +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: var(--tooltip-declaration-color); +} + +#powerTip div { + margin: 0px; + padding: 0px; + font-size: 12px; + font-family: var(--font-family-tooltip); + line-height: 16px; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before, #powerTip.ne:before, #powerTip.nw:before { + border-top-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +tt, code, kbd, samp +{ + display: inline-block; +} +/* @end */ + +u { + text-decoration: underline; +} + +details>summary { + list-style-type: none; +} + +details > summary::-webkit-details-marker { + display: none; +} + +details>summary::before { + content: "\25ba"; + padding-right:4px; + font-size: 80%; +} + +details[open]>summary::before { + content: "\25bc"; + padding-right:4px; + font-size: 80%; +} + +body { + scrollbar-color: var(--scrollbar-thumb-color) var(--scrollbar-background-color); +} + +::-webkit-scrollbar { + background-color: var(--scrollbar-background-color); + height: 12px; + width: 12px; +} +::-webkit-scrollbar-thumb { + border-radius: 6px; + box-shadow: inset 0 0 12px 12px var(--scrollbar-thumb-color); + border: solid 2px transparent; +} +::-webkit-scrollbar-corner { + background-color: var(--scrollbar-background-color); +} + diff --git a/GOLAppLib/doc/html/doxygen.svg b/GOLAppLib/doc/html/doxygen.svg new file mode 100644 index 0000000..79a7635 --- /dev/null +++ b/GOLAppLib/doc/html/doxygen.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/GOLAppLib/doc/html/dynsections.js b/GOLAppLib/doc/html/dynsections.js new file mode 100644 index 0000000..b73c828 --- /dev/null +++ b/GOLAppLib/doc/html/dynsections.js @@ -0,0 +1,192 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); + $('table.directory tr'). + removeClass('odd').filter(':visible:odd').addClass('odd'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (l'); + // add vertical lines to other rows + $('span[class=lineno]').not(':eq(0)').append(''); + // add toggle controls to lines with fold divs + $('div[class=foldopen]').each(function() { + // extract specific id to use + var id = $(this).attr('id').replace('foldopen',''); + // extract start and end foldable fragment attributes + var start = $(this).attr('data-start'); + var end = $(this).attr('data-end'); + // replace normal fold span with controls for the first line of a foldable fragment + $(this).find('span[class=fold]:first').replaceWith(''); + // append div for folded (closed) representation + $(this).after(''); + // extract the first line from the "open" section to represent closed content + var line = $(this).children().first().clone(); + // remove any glow that might still be active on the original line + $(line).removeClass('glow'); + if (start) { + // if line already ends with a start marker (e.g. trailing {), remove it + $(line).html($(line).html().replace(new RegExp('\\s*'+start+'\\s*$','g'),'')); + } + // replace minus with plus symbol + $(line).find('span[class=fold]').css('background-image',plusImg[relPath]); + // append ellipsis + $(line).append(' '+start+''+end); + // insert constructed line into closed div + $('#foldclosed'+id).html(line); + }); +} + +/* @license-end */ diff --git a/GOLAppLib/doc/html/files.html b/GOLAppLib/doc/html/files.html new file mode 100644 index 0000000..acaaf74 --- /dev/null +++ b/GOLAppLib/doc/html/files.html @@ -0,0 +1,88 @@ + + + + + + + +GOL: File List + + + + + + + + + +
+
+ + + + + + + +
+
GOL +
+
Game Of Life
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
File List
+
+
+
Here is a list of all documented files with brief descriptions:
+ + +
 GOL.h
+
+
+ + + + diff --git a/GOLAppLib/doc/html/folderclosed.svg b/GOLAppLib/doc/html/folderclosed.svg new file mode 100644 index 0000000..b04bed2 --- /dev/null +++ b/GOLAppLib/doc/html/folderclosed.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/GOLAppLib/doc/html/folderclosedd.svg b/GOLAppLib/doc/html/folderclosedd.svg new file mode 100644 index 0000000..52f0166 --- /dev/null +++ b/GOLAppLib/doc/html/folderclosedd.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/GOLAppLib/doc/html/folderopen.svg b/GOLAppLib/doc/html/folderopen.svg new file mode 100644 index 0000000..f6896dd --- /dev/null +++ b/GOLAppLib/doc/html/folderopen.svg @@ -0,0 +1,17 @@ + + + + + + + + + + diff --git a/GOLAppLib/doc/html/folderopend.svg b/GOLAppLib/doc/html/folderopend.svg new file mode 100644 index 0000000..2d1f06e --- /dev/null +++ b/GOLAppLib/doc/html/folderopend.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/GOLAppLib/doc/html/functions.html b/GOLAppLib/doc/html/functions.html new file mode 100644 index 0000000..dd7c88e --- /dev/null +++ b/GOLAppLib/doc/html/functions.html @@ -0,0 +1,188 @@ + + + + + + + +GOL: Class Members + + + + + + + + + +
+
+ + + + + + + +
+
GOL +
+
Game Of Life
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- a -

+ + +

- b -

+ + +

- c -

+ + +

- f -

+ + +

- g -

+ + +

- h -

+ + +

- i -

+ + +

- l -

+ + +

- o -

+ + +

- p -

+ + +

- r -

+ + +

- s -

+ + +

- t -

+ + +

- u -

+ + +

- w -

+ + +

- ~ -

+
+ + + + diff --git a/GOLAppLib/doc/html/functions_enum.html b/GOLAppLib/doc/html/functions_enum.html new file mode 100644 index 0000000..6293bed --- /dev/null +++ b/GOLAppLib/doc/html/functions_enum.html @@ -0,0 +1,84 @@ + + + + + + + +GOL: Class Members - Enumerations + + + + + + + + + +
+
+ + + + + + + +
+
GOL +
+
Game Of Life
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented enums with links to the class documentation for each member:
+
+ + + + diff --git a/GOLAppLib/doc/html/functions_func.html b/GOLAppLib/doc/html/functions_func.html new file mode 100644 index 0000000..3b6e1c6 --- /dev/null +++ b/GOLAppLib/doc/html/functions_func.html @@ -0,0 +1,104 @@ + + + + + + + +GOL: Class Members - Functions + + + + + + + + + +
+
+ + + + + + + +
+
GOL +
+
Game Of Life
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented functions with links to the class documentation for each member:
+
+ + + + diff --git a/GOLAppLib/doc/html/functions_type.html b/GOLAppLib/doc/html/functions_type.html new file mode 100644 index 0000000..ff70b13 --- /dev/null +++ b/GOLAppLib/doc/html/functions_type.html @@ -0,0 +1,84 @@ + + + + + + + +GOL: Class Members - Typedefs + + + + + + + + + +
+
+ + + + + + + +
+
GOL +
+
Game Of Life
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented typedefs with links to the class documentation for each member:
+
+ + + + diff --git a/GOLAppLib/doc/html/functions_vars.html b/GOLAppLib/doc/html/functions_vars.html new file mode 100644 index 0000000..e724f91 --- /dev/null +++ b/GOLAppLib/doc/html/functions_vars.html @@ -0,0 +1,104 @@ + + + + + + + +GOL: Class Members - Variables + + + + + + + + + +
+
+ + + + + + + +
+
GOL +
+
Game Of Life
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented variables with links to the class documentation for each member:
+
+ + + + diff --git a/GOLAppLib/doc/html/index.html b/GOLAppLib/doc/html/index.html new file mode 100644 index 0000000..e46c80c --- /dev/null +++ b/GOLAppLib/doc/html/index.html @@ -0,0 +1,118 @@ + + + + + + + +GOL: GOL + + + + + + + + + +
+
+ + + + + + + +
+
GOL +
+
Game Of Life
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
+
+

Fichier de présentation du projet de simulation d'automate cellulaire.

Author
GPA675
+

Ce projet met en œuvre une simulation d'automate cellulaire à 2 dimensions basée sur la classe GOL. Cette classe représente une interface abstraite pour une implémentation d'un automate cellulaire. Elle définit des types utilitaires et plusieurs fonctions abstraites.

+

Ce projet vise le développement de structures de données et d'algorithmes. De plus, il illustre un exemple de développement modulaire pertinent utilisant le polymorphisme.

+

+Fonctionnalités principales

+
    +
  • Implémentation complète d'un moteur de simulation d'automate cellulaire.
  • +
  • Gestion d'une grille 2D avec des dimensions finies et diverses stratégies de gestion des bords.
  • +
  • Capacité à gérer n'importe quelle règle définie dans le format B###.../S###....
  • +
  • Possibilité d'initialiser la grille de multiples façons (uniforme, damier, aléatoire, avec un patron, ou manuellement).
  • +
  • Représentation visuelle de la simulation à l'écran.
  • +
+

+Utilisation

+

Ce projet est destiné à être étendu et personnalisé. Pour créer votre propre simulateur, vous devez hériter de la classe GOL et implémenter toutes les fonctions virtuelles pures. Vous pouvez également ajuster les paramètres de simulation, tels que les règles de naissance/survie des cellules, la gestion des bords, et la représentation graphique.

+

+Exemple d'implémentation

+
class MySimulator : public GOL {
+
// Implémentation des fonctions virtuelles pures...
+
};
+
Moteur de simulation d'un automate cellulaire à 2 dimensions.
Definition GOL.h:124
+

Pour plus de détails sur l'utilisation et l'implémentation, veuillez consulter la documentation complète de chaque classe et fonction.

+

+Dépendances

+
    +
  • C++20
  • +
  • La solution Visual Studio donné en exemple permet d'intégrer votre travail dans un logiciel existant utilisant une interface graphique utilisateur.
  • +
  • Visual Studio 2022
  • +
+
Note
Ce projet est un exemple éducatif qui vise la fonctionnalité mais aussi les compromis nécessaire à la production d'un logiciel de qualité et performant.
+
+Cette documentation est complémentaire à l'énoncé donné.
+
+Cette documentation a été générée automatiquement à l'aide de Doxygen.
+
+
+ + + + diff --git a/GOLAppLib/doc/html/jquery.js b/GOLAppLib/doc/html/jquery.js new file mode 100644 index 0000000..1dffb65 --- /dev/null +++ b/GOLAppLib/doc/html/jquery.js @@ -0,0 +1,34 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=y(e||this.defaultElement||this)[0],this.element=y(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=y(),this.hoverable=y(),this.focusable=y(),this.classesElementLookup={},e!==this&&(y.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===e&&this.destroy()}}),this.document=y(e.style?e.ownerDocument:e.document||e),this.window=y(this.document[0].defaultView||this.document[0].parentWindow)),this.options=y.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:y.noop,_create:y.noop,_init:y.noop,destroy:function(){var i=this;this._destroy(),y.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:y.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return y.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t]=y.widget.extend({},this.options[t]),n=0;n
"),i=e.children()[0];return y("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i},getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthx(D(s),D(n))?o.important="horizontal":o.important="vertical",p.using.call(this,t,o)}),h.offset(y.extend(l,{using:t}))})},y.ui.position={fit:{left:function(t,e){var i=e.within,s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,h=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0n?0=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),y.ui.plugin={add:function(t,e,i){var s,n=y.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n").css({overflow:"hidden",position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&y(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy(),this._addedHandles.remove();function t(t){y(t).removeData("resizable").removeData("ui-resizable").off(".resizable")}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;case"aspectRatio":this._aspectRatio=!!e}},_setupHandles:function(){var t,e,i,s,n,o=this.options,h=this;if(this.handles=o.handles||(y(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=y(),this._addedHandles=y(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split(","),this.handles={},e=0;e"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.children(this.handles[t]).length||(this.element.append(n),this._addedHandles=this._addedHandles.add(n));this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=y(this.handles[e]),this._on(this.handles[e],{mousedown:h._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=y(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add(this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){h.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),h.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._addedHandles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=y(this.handles[e])[0])!==t.target&&!y.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=y(s.containment).scrollLeft()||0,i+=y(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=y(".ui-resizable-"+this.axis).css("cursor"),y("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),y.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(y.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),y("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),st.width,h=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,a=this.originalPosition.left+this.originalSize.width,r=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),h&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=a-e.minWidth),s&&l&&(t.left=a-e.maxWidth),h&&i&&(t.top=r-e.minHeight),n&&i&&(t.top=r-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e").css({overflow:"hidden"}),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){y.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),y.ui.plugin.add("resizable","animate",{stop:function(e){var i=y(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,h=n?0:i.sizeDiff.width,n={width:i.size.width-h,height:i.size.height-o},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(y.extend(n,o&&h?{top:o,left:h}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&y(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),y.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=y(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,h=o instanceof y?o.get(0):/parent/.test(o)?e.parent().get(0):o;h&&(n.containerElement=y(h),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:y(document),left:0,top:0,width:y(document).width(),height:y(document).height()||document.body.parentNode.scrollHeight}):(i=y(h),s=[],y(["Top","Right","Left","Bottom"]).each(function(t,e){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(h,"left")?h.scrollWidth:o,e=n._hasScroll(h)?h.scrollHeight:e,n.parentData={element:h,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=y(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,h={top:0,left:0},a=e.containerElement,t=!0;a[0]!==document&&/static/.test(a.css("position"))&&(h=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-h.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0),i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-h.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-h.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=y(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=y(t.helper),h=o.offset(),a=o.outerWidth()-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o})}}),y.ui.plugin.add("resizable","alsoResize",{start:function(){var t=y(this).resizable("instance").options;y(t.alsoResize).each(function(){var t=y(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=y(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,h={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};y(s.alsoResize).each(function(){var t=y(this),s=y(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];y.each(e,function(t,e){var i=(s[e]||0)+(h[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){y(this).removeData("ui-resizable-alsoresize")}}),y.ui.plugin.add("resizable","ghost",{start:function(){var t=y(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==y.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=y(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=y(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),y.ui.plugin.add("resizable","grid",{resize:function(){var t,e=y(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,h=e.axis,a="number"==typeof i.grid?[i.grid,i.grid]:i.grid,r=a[0]||1,l=a[1]||1,u=Math.round((s.width-n.width)/r)*r,p=Math.round((s.height-n.height)/l)*l,d=n.width+u,c=n.height+p,f=i.maxWidth&&i.maxWidthd,s=i.minHeight&&i.minHeight>c;i.grid=a,m&&(d+=r),s&&(c+=l),f&&(d-=r),g&&(c-=l),/^(se|s|e)$/.test(h)?(e.size.width=d,e.size.height=c):/^(ne)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.top=o.top-p):/^(sw)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.left=o.left-u):((c-l<=0||d-r<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file diff --git a/GOLAppLib/doc/html/logo_64.png b/GOLAppLib/doc/html/logo_64.png new file mode 100644 index 0000000..a2ac221 Binary files /dev/null and b/GOLAppLib/doc/html/logo_64.png differ diff --git a/GOLAppLib/doc/html/menu.js b/GOLAppLib/doc/html/menu.js new file mode 100644 index 0000000..b0b2693 --- /dev/null +++ b/GOLAppLib/doc/html/menu.js @@ -0,0 +1,136 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { + function makeTree(data,relPath) { + var result=''; + if ('children' in data) { + result+='
    '; + for (var i in data.children) { + var url; + var link; + link = data.children[i].url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + } else { + url = relPath+link; + } + result+='
  • '+ + data.children[i].text+''+ + makeTree(data.children[i],relPath)+'
  • '; + } + result+='
'; + } + return result; + } + var searchBoxHtml; + if (searchEnabled) { + if (serverSide) { + searchBoxHtml='
'+ + '
'+ + '
 '+ + ''+ + '
'+ + '
'+ + '
'+ + '
'; + } else { + searchBoxHtml='
'+ + ''+ + ' '+ + ''+ + ''+ + ''+ + ''+ + ''+ + '
'; + } + } + + $('#main-nav').before('
'+ + ''+ + ''+ + '
'); + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchBoxHtml) { + $('#main-menu').append('
  • '); + } + var $mainMenuState = $('#main-menu-state'); + var prevWidth = 0; + if ($mainMenuState.length) { + function initResizableIfExists() { + if (typeof initResizable==='function') initResizable(); + } + // animate mobile menu + $mainMenuState.change(function(e) { + var $menu = $('#main-menu'); + var options = { duration: 250, step: initResizableIfExists }; + if (this.checked) { + options['complete'] = function() { $menu.css('display', 'block') }; + $menu.hide().slideDown(options); + } else { + options['complete'] = function() { $menu.css('display', 'none') }; + $menu.show().slideUp(options); + } + }); + // set default menu visibility + function resetState() { + var $menu = $('#main-menu'); + var $mainMenuState = $('#main-menu-state'); + var newWidth = $(window).outerWidth(); + if (newWidth!=prevWidth) { + if ($(window).outerWidth()<768) { + $mainMenuState.prop('checked',false); $menu.hide(); + $('#searchBoxPos1').html(searchBoxHtml); + $('#searchBoxPos2').hide(); + } else { + $menu.show(); + $('#searchBoxPos1').empty(); + $('#searchBoxPos2').html(searchBoxHtml); + $('#searchBoxPos2').show(); + } + if (typeof searchBox!=='undefined') { + searchBox.CloseResultsWindow(); + } + prevWidth = newWidth; + } + } + $(window).ready(function() { resetState(); initResizableIfExists(); }); + $(window).resize(resetState); + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/GOLAppLib/doc/html/menudata.js b/GOLAppLib/doc/html/menudata.js new file mode 100644 index 0000000..d9ea273 --- /dev/null +++ b/GOLAppLib/doc/html/menudata.js @@ -0,0 +1,51 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Classes",url:"annotated.html",children:[ +{text:"Class List",url:"annotated.html"}, +{text:"Class Index",url:"classes.html"}, +{text:"Class Members",url:"functions.html",children:[ +{text:"All",url:"functions.html",children:[ +{text:"a",url:"functions.html#index_a"}, +{text:"b",url:"functions.html#index_b"}, +{text:"c",url:"functions.html#index_c"}, +{text:"f",url:"functions.html#index_f"}, +{text:"g",url:"functions.html#index_g"}, +{text:"h",url:"functions.html#index_h"}, +{text:"i",url:"functions.html#index_i"}, +{text:"l",url:"functions.html#index_l"}, +{text:"o",url:"functions.html#index_o"}, +{text:"p",url:"functions.html#index_p"}, +{text:"r",url:"functions.html#index_r"}, +{text:"s",url:"functions.html#index_s"}, +{text:"t",url:"functions.html#index_t"}, +{text:"u",url:"functions.html#index_u"}, +{text:"w",url:"functions.html#index_w"}, +{text:"~",url:"functions.html#index__7E"}]}, +{text:"Functions",url:"functions_func.html"}, +{text:"Variables",url:"functions_vars.html"}, +{text:"Typedefs",url:"functions_type.html"}, +{text:"Enumerations",url:"functions_enum.html"}]}]}]} diff --git a/GOLAppLib/doc/html/minus.svg b/GOLAppLib/doc/html/minus.svg new file mode 100644 index 0000000..f70d0c1 --- /dev/null +++ b/GOLAppLib/doc/html/minus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/GOLAppLib/doc/html/minusd.svg b/GOLAppLib/doc/html/minusd.svg new file mode 100644 index 0000000..5f8e879 --- /dev/null +++ b/GOLAppLib/doc/html/minusd.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/GOLAppLib/doc/html/nav_f.png b/GOLAppLib/doc/html/nav_f.png new file mode 100644 index 0000000..72a58a5 Binary files /dev/null and b/GOLAppLib/doc/html/nav_f.png differ diff --git a/GOLAppLib/doc/html/nav_fd.png b/GOLAppLib/doc/html/nav_fd.png new file mode 100644 index 0000000..032fbdd Binary files /dev/null and b/GOLAppLib/doc/html/nav_fd.png differ diff --git a/GOLAppLib/doc/html/nav_g.png b/GOLAppLib/doc/html/nav_g.png new file mode 100644 index 0000000..2093a23 Binary files /dev/null and b/GOLAppLib/doc/html/nav_g.png differ diff --git a/GOLAppLib/doc/html/nav_h.png b/GOLAppLib/doc/html/nav_h.png new file mode 100644 index 0000000..33389b1 Binary files /dev/null and b/GOLAppLib/doc/html/nav_h.png differ diff --git a/GOLAppLib/doc/html/nav_hd.png b/GOLAppLib/doc/html/nav_hd.png new file mode 100644 index 0000000..de80f18 Binary files /dev/null and b/GOLAppLib/doc/html/nav_hd.png differ diff --git a/GOLAppLib/doc/html/open.png b/GOLAppLib/doc/html/open.png new file mode 100644 index 0000000..30f75c7 Binary files /dev/null and b/GOLAppLib/doc/html/open.png differ diff --git a/GOLAppLib/doc/html/plus.svg b/GOLAppLib/doc/html/plus.svg new file mode 100644 index 0000000..0752016 --- /dev/null +++ b/GOLAppLib/doc/html/plus.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/GOLAppLib/doc/html/plusd.svg b/GOLAppLib/doc/html/plusd.svg new file mode 100644 index 0000000..0c65bfe --- /dev/null +++ b/GOLAppLib/doc/html/plusd.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/GOLAppLib/doc/html/search/all_0.js b/GOLAppLib/doc/html/search/all_0.js new file mode 100644 index 0000000..423179f --- /dev/null +++ b/GOLAppLib/doc/html/search/all_0.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['alive_0',['alive',['../class_g_o_l.html#ab40533a07f138789826faa52a6f644aaa7bd3d5f5b3cdb13aed632121206e729c',1,'GOL']]], + ['answers_1',['answers',['../struct_g_o_l_1_1_implementation_information.html#ae17a4cf1efe7db0c0191a2e1ce9b0ea3',1,'GOL::ImplementationInformation']]], + ['author_2',['Author',['../struct_g_o_l_1_1_author.html',1,'GOL']]], + ['authors_3',['authors',['../struct_g_o_l_1_1_implementation_information.html#a74518907e65d8c8d469032ee52bb574d',1,'GOL::ImplementationInformation']]] +]; diff --git a/GOLAppLib/doc/html/search/all_1.js b/GOLAppLib/doc/html/search/all_1.js new file mode 100644 index 0000000..ba621dc --- /dev/null +++ b/GOLAppLib/doc/html/search/all_1.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['blue_0',['blue',['../struct_g_o_l_1_1_color.html#af5ba4c4c2734b3de66dc3d5ddfd33067',1,'GOL::Color']]], + ['bordermanagement_1',['bordermanagement',['../class_g_o_l.html#a8f80ecf85fb6970fb8aa19fdc72488c5',1,'GOL::BorderManagement'],['../struct_g_o_l_1_1_statistics.html#aaf2de20f90d08fe72e7c19bafdabf9a7',1,'GOL::Statistics::borderManagement'],['../class_g_o_l.html#acb7eb9dfd0d705bcd3093374a65071e9',1,'GOL::borderManagement()']]] +]; diff --git a/GOLAppLib/doc/html/search/all_10.js b/GOLAppLib/doc/html/search/all_10.js new file mode 100644 index 0000000..222ce07 --- /dev/null +++ b/GOLAppLib/doc/html/search/all_10.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['updateimage_0',['updateImage',['../class_g_o_l.html#a023f299fa22d29d595ce8f5b559556eb',1,'GOL']]], + ['utilisation_1',['Utilisation',['../index.html#autotoc_md1',1,'']]] +]; diff --git a/GOLAppLib/doc/html/search/all_11.js b/GOLAppLib/doc/html/search/all_11.js new file mode 100644 index 0000000..f4817fb --- /dev/null +++ b/GOLAppLib/doc/html/search/all_11.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['warping_0',['warping',['../class_g_o_l.html#a8f80ecf85fb6970fb8aa19fdc72488c5ad26fea1f666f50ab33e246806ed4829b',1,'GOL']]], + ['width_1',['width',['../struct_g_o_l_1_1_statistics.html#a26d329b7b472a18fda78e9e4399effbc',1,'GOL::Statistics::width'],['../class_g_o_l.html#a0f9371c1d919e8731a00f72c9e7e5338',1,'GOL::width()']]] +]; diff --git a/GOLAppLib/doc/html/search/all_12.js b/GOLAppLib/doc/html/search/all_12.js new file mode 100644 index 0000000..b45cac0 --- /dev/null +++ b/GOLAppLib/doc/html/search/all_12.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['_7egol_0',['~GOL',['../class_g_o_l.html#a71f920566f6053820e4a39c1c0ffe14a',1,'GOL']]] +]; diff --git a/GOLAppLib/doc/html/search/all_2.js b/GOLAppLib/doc/html/search/all_2.js new file mode 100644 index 0000000..d85800e --- /dev/null +++ b/GOLAppLib/doc/html/search/all_2.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['color_0',['color',['../struct_g_o_l_1_1_color.html',1,'GOL::Color'],['../class_g_o_l.html#a034f2b25cdb174e8db8b45c19c6ff227',1,'GOL::color(State state) const =0']]], + ['colorchanneltype_1',['ColorChannelType',['../class_g_o_l.html#a8dfa284246f15ca8b2fe3b72d39398c4',1,'GOL']]] +]; diff --git a/GOLAppLib/doc/html/search/all_3.js b/GOLAppLib/doc/html/search/all_3.js new file mode 100644 index 0000000..7bac1d2 --- /dev/null +++ b/GOLAppLib/doc/html/search/all_3.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['dépendances_0',['Dépendances',['../index.html#autotoc_md3',1,'']]], + ['d_20implémentation_1',['Exemple d'implémentation',['../index.html#autotoc_md2',1,'']]], + ['dead_2',['dead',['../class_g_o_l.html#ab40533a07f138789826faa52a6f644aaaf58e6a506c76fc2c90a7d29cbc631c2f',1,'GOL']]] +]; diff --git a/GOLAppLib/doc/html/search/all_4.js b/GOLAppLib/doc/html/search/all_4.js new file mode 100644 index 0000000..02f84c1 --- /dev/null +++ b/GOLAppLib/doc/html/search/all_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['exemple_20d_20implémentation_0',['Exemple d'implémentation',['../index.html#autotoc_md2',1,'']]] +]; diff --git a/GOLAppLib/doc/html/search/all_5.js b/GOLAppLib/doc/html/search/all_5.js new file mode 100644 index 0000000..532dab7 --- /dev/null +++ b/GOLAppLib/doc/html/search/all_5.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['fill_0',['fill',['../class_g_o_l.html#a7fd8fe0cc3c4ea6e0234f165e0ae0909',1,'GOL']]], + ['fillalternately_1',['fillAlternately',['../class_g_o_l.html#ae15588c452004483dd12ed01f63ebb7a',1,'GOL']]], + ['firstname_2',['firstName',['../struct_g_o_l_1_1_author.html#a852b5f97cd31f1c698bdec4ac123efb0',1,'GOL::Author']]], + ['fonctionnalités_20principales_3',['Fonctionnalités principales',['../index.html#autotoc_md0',1,'']]], + ['foreveralive_4',['foreverAlive',['../class_g_o_l.html#a8f80ecf85fb6970fb8aa19fdc72488c5a6845ed92fb9b5afe34b3cb58a03143bb',1,'GOL']]], + ['foreverdead_5',['foreverDead',['../class_g_o_l.html#a8f80ecf85fb6970fb8aa19fdc72488c5a303cf94b70e6f7dffb1e094570e1759f',1,'GOL']]] +]; diff --git a/GOLAppLib/doc/html/search/all_6.js b/GOLAppLib/doc/html/search/all_6.js new file mode 100644 index 0000000..e670341 --- /dev/null +++ b/GOLAppLib/doc/html/search/all_6.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['gol_0',['gol',['../class_g_o_l.html',1,'GOL'],['../class_g_o_l.html#a2d1ce427c1902aa396385b78aa5faacd',1,'GOL::GOL()=default'],['../class_g_o_l.html#ab93d6b83a53990fd27e6fc152b549e41',1,'GOL::GOL(size_t width, size_t height, State defaultState=State::dead)'],['../index.html',1,'GOL']]], + ['green_1',['green',['../struct_g_o_l_1_1_color.html#a024ce041fb574f2531e8c3ccedfdf872',1,'GOL::Color']]] +]; diff --git a/GOLAppLib/doc/html/search/all_7.js b/GOLAppLib/doc/html/search/all_7.js new file mode 100644 index 0000000..7be5dce --- /dev/null +++ b/GOLAppLib/doc/html/search/all_7.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['height_0',['height',['../struct_g_o_l_1_1_statistics.html#acc45f6dc5a08918b5a2a4a4a54c0efd3',1,'GOL::Statistics::height'],['../class_g_o_l.html#a639614c14d19f9f200208c1b1d13e610',1,'GOL::height()']]] +]; diff --git a/GOLAppLib/doc/html/search/all_8.js b/GOLAppLib/doc/html/search/all_8.js new file mode 100644 index 0000000..23b764e --- /dev/null +++ b/GOLAppLib/doc/html/search/all_8.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['immutableasis_0',['immutableAsIs',['../class_g_o_l.html#a8f80ecf85fb6970fb8aa19fdc72488c5a1959daeb0273318781b4aa35f118676d',1,'GOL']]], + ['implémentation_1',['Exemple d'implémentation',['../index.html#autotoc_md2',1,'']]], + ['implementationinformation_2',['ImplementationInformation',['../struct_g_o_l_1_1_implementation_information.html',1,'GOL']]], + ['information_3',['information',['../class_g_o_l.html#aee16ffdbff2b3fe49bdfb961cf85a7af',1,'GOL']]], + ['iteration_4',['iteration',['../struct_g_o_l_1_1_statistics.html#a94192cc3db009bc06ce178bc70093f52',1,'GOL::Statistics']]], + ['iterationtype_5',['IterationType',['../class_g_o_l.html#a63f73ea2245fe25688a8f2b8ad444498',1,'GOL']]] +]; diff --git a/GOLAppLib/doc/html/search/all_9.js b/GOLAppLib/doc/html/search/all_9.js new file mode 100644 index 0000000..6b4e2ee --- /dev/null +++ b/GOLAppLib/doc/html/search/all_9.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['lastname_0',['lastName',['../struct_g_o_l_1_1_author.html#a789800726a95c045b18135641bdd4a0d',1,'GOL::Author']]] +]; diff --git a/GOLAppLib/doc/html/search/all_a.js b/GOLAppLib/doc/html/search/all_a.js new file mode 100644 index 0000000..f959586 --- /dev/null +++ b/GOLAppLib/doc/html/search/all_a.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['mirror_0',['mirror',['../class_g_o_l.html#a8f80ecf85fb6970fb8aa19fdc72488c5afbe322a89bc0ba531c3f0050e3935f28',1,'GOL']]] +]; diff --git a/GOLAppLib/doc/html/search/all_b.js b/GOLAppLib/doc/html/search/all_b.js new file mode 100644 index 0000000..c4b2c72 --- /dev/null +++ b/GOLAppLib/doc/html/search/all_b.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['optionnalcomments_0',['optionnalComments',['../struct_g_o_l_1_1_implementation_information.html#ad0179a43523be2c9a96a930413457cc0',1,'GOL::ImplementationInformation']]] +]; diff --git a/GOLAppLib/doc/html/search/all_c.js b/GOLAppLib/doc/html/search/all_c.js new file mode 100644 index 0000000..d055333 --- /dev/null +++ b/GOLAppLib/doc/html/search/all_c.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['principales_0',['Fonctionnalités principales',['../index.html#autotoc_md0',1,'']]], + ['processonestep_1',['processOneStep',['../class_g_o_l.html#a163e43658479f589311944e45f9d2f7d',1,'GOL']]] +]; diff --git a/GOLAppLib/doc/html/search/all_d.js b/GOLAppLib/doc/html/search/all_d.js new file mode 100644 index 0000000..9855d3d --- /dev/null +++ b/GOLAppLib/doc/html/search/all_d.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['randomize_0',['randomize',['../class_g_o_l.html#a48a750d5e715c35bcddc1c5702a1c1bd',1,'GOL']]], + ['red_1',['red',['../struct_g_o_l_1_1_color.html#a8f580a1ff7d2037d9f78bb6dcaf98a0c',1,'GOL::Color']]], + ['resize_2',['resize',['../class_g_o_l.html#aeeb68a308596df6cc833915fe25b8b31',1,'GOL']]], + ['rule_3',['rule',['../struct_g_o_l_1_1_statistics.html#ace8337d109af59325bdcb5d58b801df4',1,'GOL::Statistics::rule'],['../class_g_o_l.html#a3e7c43805a2ffbc09d0c76a20953d40d',1,'GOL::rule()']]] +]; diff --git a/GOLAppLib/doc/html/search/all_e.js b/GOLAppLib/doc/html/search/all_e.js new file mode 100644 index 0000000..07f25f4 --- /dev/null +++ b/GOLAppLib/doc/html/search/all_e.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['setbordermanagement_0',['setBorderManagement',['../class_g_o_l.html#a4e05013566674a629cb5046be9c4fd53',1,'GOL']]], + ['setfrompattern_1',['setfrompattern',['../class_g_o_l.html#af09cbd32232ddf08296e4709f2a7b7b7',1,'GOL::setFromPattern(std::string const &pattern, int centerX, int centerY)=0'],['../class_g_o_l.html#ad7f2161a93817f8eda610319a9593f82',1,'GOL::setFromPattern(std::string const &pattern)=0']]], + ['setrule_2',['setRule',['../class_g_o_l.html#aed680727507df7541f28b1b3be099364',1,'GOL']]], + ['setsolidcolor_3',['setSolidColor',['../class_g_o_l.html#a98dbb31bb7d7ab708f69f276a0849361',1,'GOL']]], + ['setstate_4',['setState',['../class_g_o_l.html#ae421e565fbf6ba31db44d71eba7227b3',1,'GOL']]], + ['size_5',['size',['../class_g_o_l.html#a7e362245fec1c4411835b6ca5eb1a62b',1,'GOL']]], + ['state_6',['state',['../class_g_o_l.html#ab40533a07f138789826faa52a6f644aa',1,'GOL::State'],['../class_g_o_l.html#a33f034838a60adb25e1ef26a3eb309aa',1,'GOL::state(int x, int y) const =0']]], + ['statistics_7',['statistics',['../struct_g_o_l_1_1_statistics.html',1,'GOL::Statistics'],['../class_g_o_l.html#ac1855e686984d4533fc2442f6f3b89f2',1,'GOL::statistics() const =0']]], + ['studentemail_8',['studentEmail',['../struct_g_o_l_1_1_author.html#ab0d7c78b1dbe43191bc19a08a3632630',1,'GOL::Author']]] +]; diff --git a/GOLAppLib/doc/html/search/all_f.js b/GOLAppLib/doc/html/search/all_f.js new file mode 100644 index 0000000..79c58f2 --- /dev/null +++ b/GOLAppLib/doc/html/search/all_f.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['tendencyabs_0',['tendencyAbs',['../struct_g_o_l_1_1_statistics.html#ae96e52cf979cb8cfe8841b92c2bbc9eb',1,'GOL::Statistics']]], + ['tendencyrel_1',['tendencyRel',['../struct_g_o_l_1_1_statistics.html#ae981c7b738fd3cf1b4c6cbf006f425b0',1,'GOL::Statistics']]], + ['title_2',['title',['../struct_g_o_l_1_1_implementation_information.html#a537522ac3ca67d3c0f8495558e9ec82c',1,'GOL::ImplementationInformation']]], + ['totalaliveabs_3',['totalAliveAbs',['../struct_g_o_l_1_1_statistics.html#ab27d09a97457ede162c76476105e13e1',1,'GOL::Statistics']]], + ['totalaliverel_4',['totalAliveRel',['../struct_g_o_l_1_1_statistics.html#af9cead801f8e57055bb74ec119aa4908',1,'GOL::Statistics']]], + ['totalcells_5',['totalCells',['../struct_g_o_l_1_1_statistics.html#a980f0bf8ca7d7838f29c18069b406284',1,'GOL::Statistics']]], + ['totaldeadabs_6',['totalDeadAbs',['../struct_g_o_l_1_1_statistics.html#a0c7ac4a263ba69f0e1a453039037b3b9',1,'GOL::Statistics']]], + ['totaldeadrel_7',['totalDeadRel',['../struct_g_o_l_1_1_statistics.html#a0eb0a1aaa2d76c389b3d49ea1c6c9bed',1,'GOL::Statistics']]] +]; diff --git a/GOLAppLib/doc/html/search/classes_0.js b/GOLAppLib/doc/html/search/classes_0.js new file mode 100644 index 0000000..772641a --- /dev/null +++ b/GOLAppLib/doc/html/search/classes_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['author_0',['Author',['../struct_g_o_l_1_1_author.html',1,'GOL']]] +]; diff --git a/GOLAppLib/doc/html/search/classes_1.js b/GOLAppLib/doc/html/search/classes_1.js new file mode 100644 index 0000000..63156ad --- /dev/null +++ b/GOLAppLib/doc/html/search/classes_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['color_0',['Color',['../struct_g_o_l_1_1_color.html',1,'GOL']]] +]; diff --git a/GOLAppLib/doc/html/search/classes_2.js b/GOLAppLib/doc/html/search/classes_2.js new file mode 100644 index 0000000..6d976ac --- /dev/null +++ b/GOLAppLib/doc/html/search/classes_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['gol_0',['GOL',['../class_g_o_l.html',1,'']]] +]; diff --git a/GOLAppLib/doc/html/search/classes_3.js b/GOLAppLib/doc/html/search/classes_3.js new file mode 100644 index 0000000..bc70e32 --- /dev/null +++ b/GOLAppLib/doc/html/search/classes_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['implementationinformation_0',['ImplementationInformation',['../struct_g_o_l_1_1_implementation_information.html',1,'GOL']]] +]; diff --git a/GOLAppLib/doc/html/search/classes_4.js b/GOLAppLib/doc/html/search/classes_4.js new file mode 100644 index 0000000..4937183 --- /dev/null +++ b/GOLAppLib/doc/html/search/classes_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['statistics_0',['Statistics',['../struct_g_o_l_1_1_statistics.html',1,'GOL']]] +]; diff --git a/GOLAppLib/doc/html/search/close.svg b/GOLAppLib/doc/html/search/close.svg new file mode 100644 index 0000000..337d6cc --- /dev/null +++ b/GOLAppLib/doc/html/search/close.svg @@ -0,0 +1,18 @@ + + + + + + diff --git a/GOLAppLib/doc/html/search/enums_0.js b/GOLAppLib/doc/html/search/enums_0.js new file mode 100644 index 0000000..177b502 --- /dev/null +++ b/GOLAppLib/doc/html/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['bordermanagement_0',['BorderManagement',['../class_g_o_l.html#a8f80ecf85fb6970fb8aa19fdc72488c5',1,'GOL']]] +]; diff --git a/GOLAppLib/doc/html/search/enums_1.js b/GOLAppLib/doc/html/search/enums_1.js new file mode 100644 index 0000000..3e178d9 --- /dev/null +++ b/GOLAppLib/doc/html/search/enums_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['state_0',['State',['../class_g_o_l.html#ab40533a07f138789826faa52a6f644aa',1,'GOL']]] +]; diff --git a/GOLAppLib/doc/html/search/enumvalues_0.js b/GOLAppLib/doc/html/search/enumvalues_0.js new file mode 100644 index 0000000..a541b18 --- /dev/null +++ b/GOLAppLib/doc/html/search/enumvalues_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['alive_0',['alive',['../class_g_o_l.html#ab40533a07f138789826faa52a6f644aaa7bd3d5f5b3cdb13aed632121206e729c',1,'GOL']]] +]; diff --git a/GOLAppLib/doc/html/search/enumvalues_1.js b/GOLAppLib/doc/html/search/enumvalues_1.js new file mode 100644 index 0000000..912725a --- /dev/null +++ b/GOLAppLib/doc/html/search/enumvalues_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['dead_0',['dead',['../class_g_o_l.html#ab40533a07f138789826faa52a6f644aaaf58e6a506c76fc2c90a7d29cbc631c2f',1,'GOL']]] +]; diff --git a/GOLAppLib/doc/html/search/enumvalues_2.js b/GOLAppLib/doc/html/search/enumvalues_2.js new file mode 100644 index 0000000..d8847f9 --- /dev/null +++ b/GOLAppLib/doc/html/search/enumvalues_2.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['foreveralive_0',['foreverAlive',['../class_g_o_l.html#a8f80ecf85fb6970fb8aa19fdc72488c5a6845ed92fb9b5afe34b3cb58a03143bb',1,'GOL']]], + ['foreverdead_1',['foreverDead',['../class_g_o_l.html#a8f80ecf85fb6970fb8aa19fdc72488c5a303cf94b70e6f7dffb1e094570e1759f',1,'GOL']]] +]; diff --git a/GOLAppLib/doc/html/search/enumvalues_3.js b/GOLAppLib/doc/html/search/enumvalues_3.js new file mode 100644 index 0000000..bb4a353 --- /dev/null +++ b/GOLAppLib/doc/html/search/enumvalues_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['immutableasis_0',['immutableAsIs',['../class_g_o_l.html#a8f80ecf85fb6970fb8aa19fdc72488c5a1959daeb0273318781b4aa35f118676d',1,'GOL']]] +]; diff --git a/GOLAppLib/doc/html/search/enumvalues_4.js b/GOLAppLib/doc/html/search/enumvalues_4.js new file mode 100644 index 0000000..f959586 --- /dev/null +++ b/GOLAppLib/doc/html/search/enumvalues_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['mirror_0',['mirror',['../class_g_o_l.html#a8f80ecf85fb6970fb8aa19fdc72488c5afbe322a89bc0ba531c3f0050e3935f28',1,'GOL']]] +]; diff --git a/GOLAppLib/doc/html/search/enumvalues_5.js b/GOLAppLib/doc/html/search/enumvalues_5.js new file mode 100644 index 0000000..3f4cc1e --- /dev/null +++ b/GOLAppLib/doc/html/search/enumvalues_5.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['warping_0',['warping',['../class_g_o_l.html#a8f80ecf85fb6970fb8aa19fdc72488c5ad26fea1f666f50ab33e246806ed4829b',1,'GOL']]] +]; diff --git a/GOLAppLib/doc/html/search/functions_0.js b/GOLAppLib/doc/html/search/functions_0.js new file mode 100644 index 0000000..0534f1f --- /dev/null +++ b/GOLAppLib/doc/html/search/functions_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['bordermanagement_0',['borderManagement',['../class_g_o_l.html#acb7eb9dfd0d705bcd3093374a65071e9',1,'GOL']]] +]; diff --git a/GOLAppLib/doc/html/search/functions_1.js b/GOLAppLib/doc/html/search/functions_1.js new file mode 100644 index 0000000..2560c49 --- /dev/null +++ b/GOLAppLib/doc/html/search/functions_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['color_0',['color',['../class_g_o_l.html#a034f2b25cdb174e8db8b45c19c6ff227',1,'GOL']]] +]; diff --git a/GOLAppLib/doc/html/search/functions_2.js b/GOLAppLib/doc/html/search/functions_2.js new file mode 100644 index 0000000..5290e51 --- /dev/null +++ b/GOLAppLib/doc/html/search/functions_2.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['fill_0',['fill',['../class_g_o_l.html#a7fd8fe0cc3c4ea6e0234f165e0ae0909',1,'GOL']]], + ['fillalternately_1',['fillAlternately',['../class_g_o_l.html#ae15588c452004483dd12ed01f63ebb7a',1,'GOL']]] +]; diff --git a/GOLAppLib/doc/html/search/functions_3.js b/GOLAppLib/doc/html/search/functions_3.js new file mode 100644 index 0000000..92d5d3c --- /dev/null +++ b/GOLAppLib/doc/html/search/functions_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['gol_0',['gol',['../class_g_o_l.html#a2d1ce427c1902aa396385b78aa5faacd',1,'GOL::GOL()=default'],['../class_g_o_l.html#ab93d6b83a53990fd27e6fc152b549e41',1,'GOL::GOL(size_t width, size_t height, State defaultState=State::dead)']]] +]; diff --git a/GOLAppLib/doc/html/search/functions_4.js b/GOLAppLib/doc/html/search/functions_4.js new file mode 100644 index 0000000..0b4bfb2 --- /dev/null +++ b/GOLAppLib/doc/html/search/functions_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['height_0',['height',['../class_g_o_l.html#a639614c14d19f9f200208c1b1d13e610',1,'GOL']]] +]; diff --git a/GOLAppLib/doc/html/search/functions_5.js b/GOLAppLib/doc/html/search/functions_5.js new file mode 100644 index 0000000..a2ba0c1 --- /dev/null +++ b/GOLAppLib/doc/html/search/functions_5.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['information_0',['information',['../class_g_o_l.html#aee16ffdbff2b3fe49bdfb961cf85a7af',1,'GOL']]] +]; diff --git a/GOLAppLib/doc/html/search/functions_6.js b/GOLAppLib/doc/html/search/functions_6.js new file mode 100644 index 0000000..bf42b26 --- /dev/null +++ b/GOLAppLib/doc/html/search/functions_6.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['processonestep_0',['processOneStep',['../class_g_o_l.html#a163e43658479f589311944e45f9d2f7d',1,'GOL']]] +]; diff --git a/GOLAppLib/doc/html/search/functions_7.js b/GOLAppLib/doc/html/search/functions_7.js new file mode 100644 index 0000000..92c909d --- /dev/null +++ b/GOLAppLib/doc/html/search/functions_7.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['randomize_0',['randomize',['../class_g_o_l.html#a48a750d5e715c35bcddc1c5702a1c1bd',1,'GOL']]], + ['resize_1',['resize',['../class_g_o_l.html#aeeb68a308596df6cc833915fe25b8b31',1,'GOL']]], + ['rule_2',['rule',['../class_g_o_l.html#a3e7c43805a2ffbc09d0c76a20953d40d',1,'GOL']]] +]; diff --git a/GOLAppLib/doc/html/search/functions_8.js b/GOLAppLib/doc/html/search/functions_8.js new file mode 100644 index 0000000..2a9f80b --- /dev/null +++ b/GOLAppLib/doc/html/search/functions_8.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['setbordermanagement_0',['setBorderManagement',['../class_g_o_l.html#a4e05013566674a629cb5046be9c4fd53',1,'GOL']]], + ['setfrompattern_1',['setfrompattern',['../class_g_o_l.html#af09cbd32232ddf08296e4709f2a7b7b7',1,'GOL::setFromPattern(std::string const &pattern, int centerX, int centerY)=0'],['../class_g_o_l.html#ad7f2161a93817f8eda610319a9593f82',1,'GOL::setFromPattern(std::string const &pattern)=0']]], + ['setrule_2',['setRule',['../class_g_o_l.html#aed680727507df7541f28b1b3be099364',1,'GOL']]], + ['setsolidcolor_3',['setSolidColor',['../class_g_o_l.html#a98dbb31bb7d7ab708f69f276a0849361',1,'GOL']]], + ['setstate_4',['setState',['../class_g_o_l.html#ae421e565fbf6ba31db44d71eba7227b3',1,'GOL']]], + ['size_5',['size',['../class_g_o_l.html#a7e362245fec1c4411835b6ca5eb1a62b',1,'GOL']]], + ['state_6',['state',['../class_g_o_l.html#a33f034838a60adb25e1ef26a3eb309aa',1,'GOL']]], + ['statistics_7',['statistics',['../class_g_o_l.html#ac1855e686984d4533fc2442f6f3b89f2',1,'GOL']]] +]; diff --git a/GOLAppLib/doc/html/search/functions_9.js b/GOLAppLib/doc/html/search/functions_9.js new file mode 100644 index 0000000..f5fc32d --- /dev/null +++ b/GOLAppLib/doc/html/search/functions_9.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['updateimage_0',['updateImage',['../class_g_o_l.html#a023f299fa22d29d595ce8f5b559556eb',1,'GOL']]] +]; diff --git a/GOLAppLib/doc/html/search/functions_a.js b/GOLAppLib/doc/html/search/functions_a.js new file mode 100644 index 0000000..d1e1507 --- /dev/null +++ b/GOLAppLib/doc/html/search/functions_a.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['width_0',['width',['../class_g_o_l.html#a0f9371c1d919e8731a00f72c9e7e5338',1,'GOL']]] +]; diff --git a/GOLAppLib/doc/html/search/functions_b.js b/GOLAppLib/doc/html/search/functions_b.js new file mode 100644 index 0000000..b45cac0 --- /dev/null +++ b/GOLAppLib/doc/html/search/functions_b.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['_7egol_0',['~GOL',['../class_g_o_l.html#a71f920566f6053820e4a39c1c0ffe14a',1,'GOL']]] +]; diff --git a/GOLAppLib/doc/html/search/mag.svg b/GOLAppLib/doc/html/search/mag.svg new file mode 100644 index 0000000..ffb6cf0 --- /dev/null +++ b/GOLAppLib/doc/html/search/mag.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/GOLAppLib/doc/html/search/mag_d.svg b/GOLAppLib/doc/html/search/mag_d.svg new file mode 100644 index 0000000..4122773 --- /dev/null +++ b/GOLAppLib/doc/html/search/mag_d.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/GOLAppLib/doc/html/search/mag_sel.svg b/GOLAppLib/doc/html/search/mag_sel.svg new file mode 100644 index 0000000..553dba8 --- /dev/null +++ b/GOLAppLib/doc/html/search/mag_sel.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/GOLAppLib/doc/html/search/mag_seld.svg b/GOLAppLib/doc/html/search/mag_seld.svg new file mode 100644 index 0000000..c906f84 --- /dev/null +++ b/GOLAppLib/doc/html/search/mag_seld.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/GOLAppLib/doc/html/search/pages_0.js b/GOLAppLib/doc/html/search/pages_0.js new file mode 100644 index 0000000..982aae7 --- /dev/null +++ b/GOLAppLib/doc/html/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['gol_0',['GOL',['../index.html',1,'']]] +]; diff --git a/GOLAppLib/doc/html/search/search.css b/GOLAppLib/doc/html/search/search.css new file mode 100644 index 0000000..19f76f9 --- /dev/null +++ b/GOLAppLib/doc/html/search/search.css @@ -0,0 +1,291 @@ +/*---------------- Search Box positioning */ + +#main-menu > li:last-child { + /* This
  • object is the parent of the search bar */ + display: flex; + justify-content: center; + align-items: center; + height: 36px; + margin-right: 1em; +} + +/*---------------- Search box styling */ + +.SRPage * { + font-weight: normal; + line-height: normal; +} + +dark-mode-toggle { + margin-left: 5px; + display: flex; + float: right; +} + +#MSearchBox { + display: inline-block; + white-space : nowrap; + background: var(--search-background-color); + border-radius: 0.65em; + box-shadow: var(--search-box-shadow); + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + width: 20px; + height: 19px; + background-image: var(--search-magnification-select-image); + margin: 0 0 0 0.3em; + padding: 0; +} + +#MSearchSelectExt { + display: inline-block; + vertical-align: middle; + width: 10px; + height: 19px; + background-image: var(--search-magnification-image); + margin: 0 0 0 0.5em; + padding: 0; +} + + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 19px; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: var(--search-foreground-color); + outline: none; + font-family: var(--font-family-search); + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + +@media(hover: none) { + /* to avoid zooming on iOS */ + #MSearchField { + font-size: 16px; + } +} + +#MSearchBox .right { + display: inline-block; + vertical-align: middle; + width: 1.4em; + height: 1.4em; +} + +#MSearchClose { + display: none; + font-size: inherit; + background : none; + border: none; + margin: 0; + padding: 0; + outline: none; + +} + +#MSearchCloseImg { + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: var(--search-active-color); +} + + + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-filter-border-color); + background-color: var(--search-filter-background-color); + z-index: 10001; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +.SelectItem { + font: 8pt var(--font-family-search); + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: var(--font-family-monospace); + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: var(--search-filter-foreground-color); + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: var(--search-filter-foreground-color); + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: var(--search-filter-highlight-text-color); + background-color: var(--search-filter-highlight-bg-color); + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + /*width: 60ex;*/ + height: 15em; +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-results-border-color); + background-color: var(--search-results-background-color); + z-index:10000; + width: 300px; + height: 400px; + overflow: auto; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +div.SRPage { + margin: 5px 2px; + background-color: var(--search-results-background-color); +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + font-size: 8pt; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; + font-family: var(--font-family-search); +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: var(--font-family-search); +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: var(--nav-gradient-active-image-parent); + background-repeat: repeat-x; + text-shadow: 0 1px 1px #000000; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/GOLAppLib/doc/html/search/search.js b/GOLAppLib/doc/html/search/search.js new file mode 100644 index 0000000..6fd40c6 --- /dev/null +++ b/GOLAppLib/doc/html/search/search.js @@ -0,0 +1,840 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function convertToId(search) +{ + var result = ''; + for (i=0;i do a search + { + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) // Up + { + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } + else if (e.keyCode==13 || e.keyCode==27) + { + e.stopPropagation(); + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() + { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() + { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() + { + this.keyTimeout = 0; + + // strip leading whitespace + var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + var code = searchValue.toLowerCase().charCodeAt(0); + var idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair + { + idxChar = searchValue.substr(0, 2); + } + + var jsFile; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + jsFile = this.resultsPath + indexSectionNames[this.searchIndex] + '_' + hexCode + '.js'; + } + + var loadJS = function(url, impl, loc){ + var scriptTag = document.createElement('script'); + scriptTag.src = url; + scriptTag.onload = impl; + scriptTag.onreadystatechange = impl; + loc.appendChild(scriptTag); + } + + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + var domSearchBox = this.DOMSearchBox(); + var domPopupSearchResults = this.DOMPopupSearchResults(); + var domSearchClose = this.DOMSearchClose(); + var resultsPath = this.resultsPath; + + var handleResults = function() { + document.getElementById("Loading").style.display="none"; + if (typeof searchData !== 'undefined') { + createResults(resultsPath); + document.getElementById("NoMatches").style.display="none"; + } + + if (idx!=-1) { + searchResults.Search(searchValue); + } else { // no file with search results => force empty search results + searchResults.Search('===='); + } + + if (domPopupSearchResultsWindow.style.display!='block') + { + domSearchClose.style.display = 'inline-block'; + var left = getXPos(domSearchBox) + 150; + var top = getYPos(domSearchBox) + 20; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + var maxWidth = document.body.clientWidth; + var maxHeight = document.body.clientHeight; + var width = 300; + if (left<10) left=10; + if (width+left+8>maxWidth) width=maxWidth-left-8; + var height = 400; + if (height+top+8>maxHeight) height=maxHeight-top-8; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResultsWindow.style.height = height + 'px'; + } + } + + if (jsFile) { + loadJS(jsFile, handleResults, this.DOMPopupSearchResultsWindow()); + } else { + handleResults(); + } + + this.lastSearchValue = searchValue; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) + { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) + { + this.DOMSearchBox().className = 'MSearchBoxActive'; + this.searchActive = true; + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + this.DOMSearchField().value = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults(name) +{ + // The number of matches from the last run of . + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) + { + var parentElement = document.getElementById(id); + var element = parentElement.firstChild; + + while (element && element!=parentElement) + { + if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') + { + return element; + } + + if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) + { + element = element.firstChild; + } + else if (element.nextSibling) + { + element = element.nextSibling; + } + else + { + do + { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) + { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) + { + var element = this.FindChildElement(id); + if (element) + { + if (element.style.display == 'block') + { + element.style.display = 'none'; + } + else + { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) + { + if (!search) // get search word from URL + { + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + var resultRows = document.getElementsByTagName("div"); + var matches = 0; + + var i = 0; + while (i < resultRows.length) + { + var row = resultRows.item(i); + if (row.className == "SRResult") + { + var rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) + { + row.style.display = 'block'; + matches++; + } + else + { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) // no results + { + document.getElementById("NoMatches").style.display='block'; + } + else // at least one result + { + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) + { + if (e.type == "keydown") + { + this.repeatOn = false; + this.lastKey = e.keyCode; + } + else if (e.type == "keypress") + { + if (!this.repeatOn) + { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } + else if (e.type == "keyup") + { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + var newIndex = itemIndex-1; + var focusItem = this.NavPrev(newIndex); + if (focusItem) + { + var child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') // children visible + { + var n=0; + var tmpElem; + while (1) // search for last child + { + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) + { + focusItem = tmpElem; + } + else // found it! + { + break; + } + n++; + } + } + } + if (focusItem) + { + focusItem.focus(); + } + else // return focus to search field + { + document.getElementById("MSearchField").focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = itemIndex+1; + var focusItem; + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') // children visible + { + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } + else if (this.lastKey==39) // Right + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } + else if (this.lastKey==37) // Left + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + if (childIndex>0) + { + var newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } + else // already at first child, jump to parent + { + document.getElementById('Item'+itemIndex).focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = childIndex+1; + var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) // last child, jump to parent next parent + { + elem = this.NavNext(itemIndex+1); + } + if (elem) + { + elem.focus(); + } + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } +} + +function setKeyActions(elem,action) +{ + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); +} + +function setClassAttr(elem,attr) +{ + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); +} + +function createResults(resultsPath) +{ + var results = document.getElementById("SRResults"); + results.innerHTML = ''; + for (var e=0; e + + + + + + +GOL: Member List + + + + + + + + + +
    +
    + + + + + + + +
    +
    GOL +
    +
    Game Of Life
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    GOL::Author Member List
    +
    +
    + +

    This is the complete list of members for GOL::Author, including all inherited members.

    + + + + +
    firstNameGOL::Author
    lastNameGOL::Author
    studentEmailGOL::Author
    + + + + diff --git a/GOLAppLib/doc/html/struct_g_o_l_1_1_author.html b/GOLAppLib/doc/html/struct_g_o_l_1_1_author.html new file mode 100644 index 0000000..ed44416 --- /dev/null +++ b/GOLAppLib/doc/html/struct_g_o_l_1_1_author.html @@ -0,0 +1,114 @@ + + + + + + + +GOL: GOL::Author Struct Reference + + + + + + + + + +
    +
    + + + + + + + +
    +
    GOL +
    +
    Game Of Life
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    GOL::Author Struct Reference
    +
    +
    + +

    Le type représentant les informations permettant d'identifier les auteurs de l'implémentation. + More...

    + +

    #include <GOL.h>

    + + + + + + + + + + + +

    +Public Attributes

    +std::string lastName
     Le nom de famille de l'auteur.
     
    +std::string firstName
     Le prénom de l'auteur.
     
    +std::string studentEmail
     L'adresse courriel de l'auteur. On désire l'adresse courriel étudiante.
     
    +

    Detailed Description

    +

    Le type représentant les informations permettant d'identifier les auteurs de l'implémentation.

    +

    Cette structure encapsule les informations permettant d'identifier les auteurs de l'implémentation.

    +
    + + + + diff --git a/GOLAppLib/doc/html/struct_g_o_l_1_1_color-members.html b/GOLAppLib/doc/html/struct_g_o_l_1_1_color-members.html new file mode 100644 index 0000000..a0a4269 --- /dev/null +++ b/GOLAppLib/doc/html/struct_g_o_l_1_1_color-members.html @@ -0,0 +1,93 @@ + + + + + + + +GOL: Member List + + + + + + + + + +
    +
    + + + + + + + +
    +
    GOL +
    +
    Game Of Life
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    GOL::Color Member List
    +
    +
    + +

    This is the complete list of members for GOL::Color, including all inherited members.

    + + + + +
    blueGOL::Color
    greenGOL::Color
    redGOL::Color
    + + + + diff --git a/GOLAppLib/doc/html/struct_g_o_l_1_1_color.html b/GOLAppLib/doc/html/struct_g_o_l_1_1_color.html new file mode 100644 index 0000000..54325c0 --- /dev/null +++ b/GOLAppLib/doc/html/struct_g_o_l_1_1_color.html @@ -0,0 +1,114 @@ + + + + + + + +GOL: GOL::Color Struct Reference + + + + + + + + + +
    +
    + + + + + + + +
    +
    GOL +
    +
    Game Of Life
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    GOL::Color Struct Reference
    +
    +
    + +

    Le type représentant une couleur. + More...

    + +

    #include <GOL.h>

    + + + + + + + + + + + +

    +Public Attributes

    +ColorChannelType red = 0
     Le canal de couleur rouge.
     
    +ColorChannelType green = 0
     Le canal de couleur verte.
     
    +ColorChannelType blue = 0
     Le canal de couleur bleue.
     
    +

    Detailed Description

    +

    Le type représentant une couleur.

    +

    Le type choisi est une structure contenant 3 canaux de couleur.

    +
    + + + + diff --git a/GOLAppLib/doc/html/struct_g_o_l_1_1_implementation_information-members.html b/GOLAppLib/doc/html/struct_g_o_l_1_1_implementation_information-members.html new file mode 100644 index 0000000..79ffd97 --- /dev/null +++ b/GOLAppLib/doc/html/struct_g_o_l_1_1_implementation_information-members.html @@ -0,0 +1,94 @@ + + + + + + + +GOL: Member List + + + + + + + + + +
    +
    + + + + + + + +
    +
    GOL +
    +
    Game Of Life
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    GOL::ImplementationInformation Member List
    +
    + + + + + diff --git a/GOLAppLib/doc/html/struct_g_o_l_1_1_implementation_information.html b/GOLAppLib/doc/html/struct_g_o_l_1_1_implementation_information.html new file mode 100644 index 0000000..d9f5894 --- /dev/null +++ b/GOLAppLib/doc/html/struct_g_o_l_1_1_implementation_information.html @@ -0,0 +1,119 @@ + + + + + + + +GOL: GOL::ImplementationInformation Struct Reference + + + + + + + + + +
    +
    + + + + + + + +
    +
    GOL +
    +
    Game Of Life
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    GOL::ImplementationInformation Struct Reference
    +
    +
    + +

    Le type représentant les informations documentant l'implémentation. + More...

    + +

    #include <GOL.h>

    + + + + + + + + + + + + + + +

    +Public Attributes

    +std::string title
     Le titre de l'implémentation.
     
    +std::vector< Authorauthors
     Les auteurs de l'implémentation.
     
    +std::vector< std::string > answers
     Les réponses aux questions du laboratoire.
     
    +std::vector< std::string > optionnalComments
     Des commentaires optionnels.
     
    +

    Detailed Description

    +

    Le type représentant les informations documentant l'implémentation.

    +

    Cette structure encapsule les informations documentant l'implémentation. Ces informations ne sont pas techniquement nécessaires au déroulement du progamme mais servent de mécanisme à l'interface usager et de stratégie de remise.

    +

    Cette structure doit être rempli adéquatement car elle est un peu l'équivalent du rapport. Voir les détails dans la section rapport de l'énoncé.

    +
    + + + + diff --git a/GOLAppLib/doc/html/struct_g_o_l_1_1_statistics-members.html b/GOLAppLib/doc/html/struct_g_o_l_1_1_statistics-members.html new file mode 100644 index 0000000..651a1e4 --- /dev/null +++ b/GOLAppLib/doc/html/struct_g_o_l_1_1_statistics-members.html @@ -0,0 +1,102 @@ + + + + + + + +GOL: Member List + + + + + + + + + +
    +
    + + + + + + + +
    +
    GOL +
    +
    Game Of Life
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    GOL::Statistics Member List
    +
    + + + + + diff --git a/GOLAppLib/doc/html/struct_g_o_l_1_1_statistics.html b/GOLAppLib/doc/html/struct_g_o_l_1_1_statistics.html new file mode 100644 index 0000000..d4f6b14 --- /dev/null +++ b/GOLAppLib/doc/html/struct_g_o_l_1_1_statistics.html @@ -0,0 +1,172 @@ + + + + + + + +GOL: GOL::Statistics Struct Reference + + + + + + + + + +
    +
    + + + + + + + +
    +
    GOL +
    +
    Game Of Life
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    GOL::Statistics Struct Reference
    +
    +
    + +

    Le type représentant des données statistiques de la simulation. + More...

    + +

    #include <GOL.h>

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Public Attributes

    +std::optional< std::string > rule
     La règle de la simulation exprimé par la chaîne de caractères de format "B###/S###".
     
    +std::optional< BorderManagementborderManagement
     La stratégie de gestion de bord.
     
    +std::optional< size_t > width
     La largeur de la grille.
     
    +std::optional< size_t > height
     La hauteur de la grille.
    +
     
    +std::optional< size_t > totalCells
     Le nombre total de cellules.
     
    +std::optional< IterationTypeiteration
     Le nombre d'itération de la simulation.
     
    +std::optional< size_t > totalDeadAbs
     Le nombre total de cellules mortes en valeur absolue.
     
    +std::optional< size_t > totalAliveAbs
     Le nombre total de cellules vivantes en valeur absolue.
     
    +std::optional< float > totalDeadRel
     Le nombre total de cellules mortes en valeur relative du nombre total de cellules.
     
    +std::optional< float > totalAliveRel
     Le nombre total de cellules vivantes en valeur relative du nombre total de cellules.
    +
     
    +std::optional< int > tendencyAbs
     La tendance de la variation entre le nombre de cellules mortes et vivantes en valeur absolue.
     
    +std::optional< float > tendencyRel
     La tendance de la variation entre le nombre de cellules mortes et vivantes en valeur relative.
    +
     
    +

    Detailed Description

    +

    Le type représentant des données statistiques de la simulation.

    +

    Cette structure encapsule deux groupes d'information sur la simulation en cours :

      +
    • les informations de la configuration de la simulation
        +
      • règle
      • +
      • stratégie de gestion de bord
      • +
      • largeur de la grille
      • +
      • hauteur de la grille
      • +
      • nombre total de cellules
      • +
      +
    • +
    • les informations sur le déroulement de la simulation
        +
      • itération courante (combien de pas de simulation)
      • +
      • nombre total de cellules mortes en valeur absolue
      • +
      • nombre total de cellules vivantes en valeur absolue
      • +
      • nombre total de cellules mortes en valeur relative
      • +
      • nombre total de cellules vivantes en valeur relative
      • +
      • tendance de la variation entre le nombre de cellules mortes et vivantes en valeur absolue
      • +
      • tendance de la variation entre le nombre de cellules mortes et vivantes en valeur relative
      • +
      +
    • +
    +
    + + + + diff --git a/GOLAppLib/doc/html/sync_off.png b/GOLAppLib/doc/html/sync_off.png new file mode 100644 index 0000000..3b443fc Binary files /dev/null and b/GOLAppLib/doc/html/sync_off.png differ diff --git a/GOLAppLib/doc/html/sync_on.png b/GOLAppLib/doc/html/sync_on.png new file mode 100644 index 0000000..e08320f Binary files /dev/null and b/GOLAppLib/doc/html/sync_on.png differ diff --git a/GOLAppLib/doc/html/tab_a.png b/GOLAppLib/doc/html/tab_a.png new file mode 100644 index 0000000..3b725c4 Binary files /dev/null and b/GOLAppLib/doc/html/tab_a.png differ diff --git a/GOLAppLib/doc/html/tab_ad.png b/GOLAppLib/doc/html/tab_ad.png new file mode 100644 index 0000000..e34850a Binary files /dev/null and b/GOLAppLib/doc/html/tab_ad.png differ diff --git a/GOLAppLib/doc/html/tab_b.png b/GOLAppLib/doc/html/tab_b.png new file mode 100644 index 0000000..e2b4a86 Binary files /dev/null and b/GOLAppLib/doc/html/tab_b.png differ diff --git a/GOLAppLib/doc/html/tab_bd.png b/GOLAppLib/doc/html/tab_bd.png new file mode 100644 index 0000000..91c2524 Binary files /dev/null and b/GOLAppLib/doc/html/tab_bd.png differ diff --git a/GOLAppLib/doc/html/tab_h.png b/GOLAppLib/doc/html/tab_h.png new file mode 100644 index 0000000..fd5cb70 Binary files /dev/null and b/GOLAppLib/doc/html/tab_h.png differ diff --git a/GOLAppLib/doc/html/tab_hd.png b/GOLAppLib/doc/html/tab_hd.png new file mode 100644 index 0000000..2489273 Binary files /dev/null and b/GOLAppLib/doc/html/tab_hd.png differ diff --git a/GOLAppLib/doc/html/tab_s.png b/GOLAppLib/doc/html/tab_s.png new file mode 100644 index 0000000..ab478c9 Binary files /dev/null and b/GOLAppLib/doc/html/tab_s.png differ diff --git a/GOLAppLib/doc/html/tab_sd.png b/GOLAppLib/doc/html/tab_sd.png new file mode 100644 index 0000000..757a565 Binary files /dev/null and b/GOLAppLib/doc/html/tab_sd.png differ diff --git a/GOLAppLib/doc/html/tabs.css b/GOLAppLib/doc/html/tabs.css new file mode 100644 index 0000000..71c8a47 --- /dev/null +++ b/GOLAppLib/doc/html/tabs.css @@ -0,0 +1 @@ +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:var(--nav-menu-button-color);-webkit-transition:all .25s;transition:all .25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px,1px,1px,1px)}#main-menu-state:not(:checked) ~ #main-menu{display:none}#main-menu-state:checked ~ #main-menu{display:block}@media(min-width:768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked) ~ #main-menu{display:block}}.sm-dox{background-image:var(--nav-gradient-image)}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0 12px;padding-right:43px;font-family:var(--font-family-nav);font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:var(--nav-text-normal-shadow);color:var(--nav-text-normal-color);outline:0}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a.current{color:#d23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:var(--nav-menu-toggle-color);-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{-moz-border-radius:5px 5px 0 0;-webkit-border-radius:5px;border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{-moz-border-radius:0 0 5px 5px;-webkit-border-radius:0;border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox ul{background:var(--nav-menu-background-color)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:var(--nav-menu-background-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:0 1px 1px black}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media(min-width:768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:var(--nav-gradient-image);line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:var(--nav-text-normal-color) transparent transparent transparent;background:transparent;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0 12px;background-image:var(--nav-separator-image);background-repeat:no-repeat;background-position:right;-moz-border-radius:0 !important;-webkit-border-radius:0;border-radius:0 !important}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a:hover span.sub-arrow{border-color:var(--nav-text-hover-color) transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent var(--nav-menu-background-color) transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:var(--nav-menu-background-color);-moz-border-radius:5px !important;-webkit-border-radius:5px;border-radius:5px !important;-moz-box-shadow:0 5px 9px rgba(0,0,0,0.2);-webkit-box-shadow:0 5px 9px rgba(0,0,0,0.2);box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent var(--nav-menu-foreground-color);border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:var(--nav-menu-foreground-color);background-image:none;border:0 !important;color:var(--nav-menu-foreground-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent var(--nav-text-hover-color)}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:var(--nav-menu-background-color);height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #d23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#d23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent var(--nav-menu-foreground-color) transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:var(--nav-menu-foreground-color) transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:var(--nav-gradient-image)}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:var(--nav-menu-background-color)}} \ No newline at end of file diff --git a/GOLAppLib/header/GOL.h b/GOLAppLib/header/GOL.h new file mode 100644 index 0000000..1b6f7bb --- /dev/null +++ b/GOLAppLib/header/GOL.h @@ -0,0 +1,728 @@ +#pragma once +#ifndef GOL_INTERFACE_H +#define GOL_INTERFACE_H + + +#include +#include +#include + + +// +// ___ __ __ ____ ___ ____ _____ _ _ _ _____ +// |_ _| \/ | _ \ / _ \| _ \_ _|/ \ | \ | |_ _| +// | || |\/| | |_) | | | | |_) || | / _ \ | \| | | | +// | || | | | __/| |_| | _ < | |/ ___ \| |\ | | | +// |___|_| |_|_| \___/|_| \_\|_/_/ \_\_| \_| |_| +// +// +// Attention, vous ne pouvez pas modifier ce fichier. +// + + + +//! +//! \brief Moteur de simulation d'un automate cellulaire à 2 dimensions. +//! +//! \details La classe GOL représente une interface standardisée visant +//! l'implémentation complète et suffisante d'un engin de simulation +//! d'un automate cellulaire à 2 dimensions. +//! +//! Cette classe abstraite ne fait rien et ne possède aucun attribut. Elle ne +//! constitue qu'un modèle standardisé pouvant être facilement utilisé pour +//! réaliser une simulation. +//! +//! La classe possède : +//! - la définition des types utilitaires +//! - la définition et l'implémentation de : +//! - le constructeur par défaut +//! - un constructeur personnalisé (cette définition est absolument inutile +//! et en temps normal elle serait absente de ce fichier, sa présence +//! n'est qu'à titre d'exemples pédagogiques) +//! - le destructeur virtuel +//! - la définition de plusieurs fonctions abstraites (virtuelles pures). +//! +//! L'approche utilisée est donc un parfait exemple d'un développement +//! modulaire s'appuyant sur le polymorphisme. Néanmoins, pour rester critique, +//! cette classe présente un défaut de conception du fait qu'elle réalise +//! beaucoup trop de tâches à elle seule. Un découpage mieux structuré serait +//! préférable considérant un projet d'envergure. La forme actuelle de cette +//! conception vise à mettre l'emphase du développement sur les objetifs du +//! projet sans être dérangé par d'autres aspects : conception et implémentation +//! de structures de données et d'algorithmes. +//! +//! Puisque cette classe est abstraite, elle est destiné à être héritée afin +//! que vous implémentiez **entièrement** un engin de type automate cellulaire +//! répondant strictement à l'interface présentée. +//! +//! Éléments importants : +//! - Vous devez implémenter entièrement le moteur de simulation. +//! - La grille est 2d de dimensions finies. +//! - **En tout temps la classe doit être dans un état +//! consistant.** Peu importe l'ordre d'appel des fonctions. De plus, +//! il doit être possible d'appeler n'importe quelle fonction et que +//! son effet soit immédiat (dans la mesure de la logique). +//! - À l'initialisation de votre engin, la configuration par défaut est : +//! - grille de 100 x 100 +//! - toutes les cellules sont mortes +//! - règle de Conway : `B3/S23` +//! - stratégie de gestion de bord : BorderManagement::foreverDead +//! - itération courante : 0 +//! - les couleurs sont noires pour les cellules mortes et blanches +//! pour les cellules vivantes +//! - Vous devez avoir une représentation interne indépendante de la +//! représentation à l'écran. +//! - Vous devez être en mesure de gérer n'importe quelle règle. Les règles +//! sont définies par une chaîne de caractère suivant ce format : +//! `B###.../S###...` +//! - Vous devez être en mesure de gérer les effets de bord selon +//! 5 stratégies différentes : +//! 1. immuable tel quel +//! 2. mort pour toujours +//! 3. vivant pour toujours +//! 4. téléportation +//! 5. miroir +//! - Vous devez être en mesure d'initialiser la grille de plusieurs façons : +//! 1. remplir avec une valeur uniforme (mort ou vivant) +//! 2. remplir en forme de damier (en pouvant préciser la valeur de +//! la première cellule : mort ou vivant) +//! 3. remplir aléatoirement avec un pourcentage de probabilité, pour +//! chaque cellule, d'être vivant +//! 4. mettre un patron centré sur la grille +//! 5. manuellement, cellule par cellule, avec la fonction setState(...) +//! - La fonction GOL::processOneStep doit faire un pas de +//! simulation. +//! - Vous devez utiliser le type GOL::State pour représenter chaque cellule +//! de la simulation utilise, . +//! - Vous devez être capable de produire une représentation visuelle +//! de la représentation interne. La fonction GOL::updateImage +//! vous passe le _buffer_ où se trouve l'image de sortie. C'est dans +//! cette zone mémoire que vous devez dessiner la représentation visuelle +//! de la simulation. +//! - Plusieurs mutateurs réinitialisent le compteur d'itération à 0. +//! - Voici ceux qui réinitialisent le compteur d'itération : +//! - GOL::resize +//! - GOL::fill +//! - GOL::fillAlternately +//! - GOL::setFromPattern +//! - GOL::randomize +//! - GOL::setRule +//! - GOL::setBorderManagement +//! - Ce dernier laisse inchangé le compteur d'itération : +//! - GOL::setState +//! - À tout moment, il doit être possible de questionner la simulation afin +//! d'obtenir les informations contenues dans la structure GOL::Statistics. +//! On remarque que toutes les informations sont stockées dans un +//! std::optional. Ainsi, si vous n'avez pas la réponse, vous pouvez +//! simplement laissé la valeur indéterminée. +//! - Vous devez implémenter une autre classe qui s'occupe de gérer une +//! structure de données 2d. Cette classe, nommée Grid, est une +//! encapsulation dirigée d'une matrice 2d. Voir plus bas dans cette +//! page pour les détails. +//! +class GOL +{ +public: + // ____ __ __ _ _ _ _ _ _ + // | _ \ /_/ / _(_)_ __ (_) |_(_) ___ _ __ __| | ___ ___ | |_ _ _ _ __ ___ ___ + // | | | |/ _ \ |_| | '_ \| | __| |/ _ \| '_ \ / _` |/ _ \/ __| | __| | | | '_ \ / _ \/ __| + // | |_| | __/ _| | | | | | |_| | (_) | | | | | (_| | __/\__ \ | |_| |_| | |_) | __/\__ \ + // |____/ \___|_| |_|_| |_|_|\__|_|\___/|_| |_| \__,_|\___||___/ \__|\__, | .__/ \___||___/ + // |___/|_| + // + //! \brief Le type représentant l'état d'une cellule. + //! \details L'état d'une cellule peut être mort ou vivant. + enum class State : uint8_t { + dead = 0, //!< L'état mort. + alive = 1, //!< L'état vivant. + }; + // + //! \brief Le type représentant le nombre d'itération de la simulation. + //! \details Le type choisi est un entier non signé de 32 bits. + using IterationType = uint32_t; + // + //! \brief Le type représentant la stratégie de gestion de bord. + //! \details L'algorithme de simulation doit gérer les effets de bord. + //! C'est-à-dire que les calculs de voisinage doivent être adaptés pour + //! les cellules situées sur les bords de la grille. + //! + //! 5 modes de gestion sont possibles. + enum class BorderManagement : uint8_t { + immutableAsIs = 0, //!< Les cellules du contour ne sont jamais modifiées. Elles sont laissées dans leur état courant. + foreverDead, //!< Les cellules du contour ne sont jamais modifiées. Elles sont toujours mortes. + foreverAlive, //!< Les cellules du contour ne sont jamais modifiées. Elles sont toujours vivantes. + warping, //!< Les cellules du contour sont évaluées. On utilise les cellules du côté opposé de la grille pour les cellules extérieures. + mirror, //!< Les cellules du contour sont évaluées. On utilise les cellules du côté opposé de la cellule pour les cellules extérieures. + }; + // + //! \brief Le type représentant un canal de couleur. + //! \details Le type choisi est un entier non signé de 8 bits. + using ColorChannelType = uint8_t; + // + //! \brief Le type représentant une couleur. + //! \details Le type choisi est une structure contenant 3 canaux de couleur. + struct Color { + ColorChannelType red = 0; //!< Le canal de couleur rouge. + ColorChannelType green = 0; //!< Le canal de couleur verte. + ColorChannelType blue = 0; //!< Le canal de couleur bleue. + }; + // + //! \brief Le type représentant des données statistiques de la simulation. + //! \details Cette structure encapsule deux groupes d'information sur la simulation en cours : + //! - les informations de la configuration de la simulation + //! - règle + //! - stratégie de gestion de bord + //! - largeur de la grille + //! - hauteur de la grille + //! - nombre total de cellules + //! - les informations sur le déroulement de la simulation + //! - itération courante (combien de pas de simulation) + //! - nombre total de cellules mortes en valeur absolue + //! - nombre total de cellules vivantes en valeur absolue + //! - nombre total de cellules mortes en valeur relative + //! - nombre total de cellules vivantes en valeur relative + //! - tendance de la variation entre le nombre de cellules mortes et vivantes en valeur absolue + //! - tendance de la variation entre le nombre de cellules mortes et vivantes en valeur relative + struct Statistics { + std::optional rule; //!< La règle de la simulation exprimé par la chaîne de caractères de format "B###/S###". + std::optional borderManagement; //!< La stratégie de gestion de bord. + std::optional width; //!< La largeur de la grille. + std::optional height; //!< La hauteur de la grille. + std::optional totalCells; //!< Le nombre total de cellules. + std::optional iteration; //!< Le nombre d'itération de la simulation. + std::optional totalDeadAbs; //!< Le nombre total de cellules mortes en valeur absolue. + std::optional totalAliveAbs; //!< Le nombre total de cellules vivantes en valeur absolue. + std::optional totalDeadRel; //!< Le nombre total de cellules mortes en valeur relative du nombre total de cellules. + std::optional totalAliveRel; //!< Le nombre total de cellules vivantes en valeur relative du nombre total de cellules. + std::optional tendencyAbs; //!< La tendance de la variation entre le nombre de cellules mortes et vivantes en valeur absolue. + std::optional tendencyRel; //!< La tendance de la variation entre le nombre de cellules mortes et vivantes en valeur relative. + }; + // + //! \brief Le type représentant les informations permettant d'identifier les auteurs de l'implémentation. + //! \details Cette structure encapsule les informations permettant d'identifier les auteurs de l'implémentation. + struct Author { + std::string lastName; //!< Le nom de famille de l'auteur. + std::string firstName; //!< Le prénom de l'auteur. + std::string studentEmail; //!< L'adresse courriel de l'auteur. On désire l'adresse courriel étudiante. + }; + // + //! \brief Le type représentant les informations documentant l'implémentation. + //! \details Cette structure encapsule les informations documentant + //! l'implémentation. Ces informations ne sont pas techniquement nécessaires + //! au déroulement du progamme mais servent de mécanisme à l'interface usager + //! et de stratégie de remise. + //! + //! Cette structure doit être rempli adéquatement car elle est un peu + //! l'équivalent du rapport. Voir les détails dans la section rapport de + //! l'énoncé. + struct ImplementationInformation { + std::string title; //!< Le titre de l'implémentation. + std::vector authors; //!< Les auteurs de l'implémentation. + std::vector answers; //!< Les réponses aux questions du laboratoire. + std::vector optionnalComments; //!< Des commentaires optionnels. + }; + + + + // + // ____ _ _ __ ____ _ _ + // / ___|___ _ __ ___| |_ _ __ _ _ ___| |_ ___ _ _ _ __ ___ / / | _ \ ___ ___| |_ _ __ _ _ ___| |_ ___ _ _ _ __ + // | | / _ \| '_ \/ __| __| '__| | | |/ __| __/ _ \ | | | '__/ __| / / | | | |/ _ \/ __| __| '__| | | |/ __| __/ _ \ | | | '__| + // | |__| (_) | | | \__ \ |_| | | |_| | (__| || __/ |_| | | \__ \ / / | |_| | __/\__ \ |_| | | |_| | (__| || __/ |_| | | + // \____\___/|_| |_|___/\__|_| \__,_|\___|\__\___|\__,_|_| |___/ /_/ |____/ \___||___/\__|_| \__,_|\___|\__\___|\__,_|_| + // + // + // Les classes héritant de GOL doivent réaliser : + // - le constructeur par défaut : _class_() + // - le constructeur d'initialisation proposé : _class_(size_t width, size_t height, State defaultState = State::dead) + // - le destructeur : ~_class_() + // + //! \brief Constructeur par défaut. + GOL() = default; + // + //! \brief Constructeur d'initialisation personnalisé. + GOL(size_t width, size_t height, State defaultState = State::dead) {} + // + //! Destructeur. + virtual ~GOL() = default; + // + // Les 4 autres fonctions spéciales sont laissées à votre discrétion. + // Toutefois, un simple -delete- est suffisant pour ce premier laboratoire. + // _class_(_class_ const &) = delete; + // _class_(_class_ &&) = delete; + // _class_& operator=(_class_ const &) = delete; + // _class_& operator=(_class_ &&) = delete; + + + // + // _ + // / \ ___ ___ ___ ___ ___ ___ _ _ _ __ ___ + // / _ \ / __/ __/ _ \/ __/ __|/ _ \ | | | '__/ __| + // / ___ \ (_| (_| __/\__ \__ \ __/ |_| | | \__ \ + // /_/ \_\___\___\___||___/___/\___|\__,_|_| |___/ + // + // + //! \brief Accesseur retournant la largeur de la grille de simualtion. + //! + //! \return La largeur de la grille. + virtual size_t width() const = 0; + // + //! \brief Accesseur retournant la hauteur de la grille de simualtion. + //! + //! \return La hauteur de la grille. + virtual size_t height() const = 0; + // + //! \brief Accesseur retournant le nombre total de cellules de la grille + //! de simualtion. + //! + //! \return Le nombre total de cellules de la grille. + virtual size_t size() const = 0; + // + //! \brief Accesseur retournant l'état d'une cellule. + //! + //! \details Cette fonction ne valide pas les entrées pour une raison de + //! performance. + //! L'origine est le coin supérieur gauche de la grille. + //! + //! \param x La coordonnée en x de la cellule. + //! \param y La coordonnée en y de la cellule. + //! \return L'état de la cellule. + virtual State state(int x, int y) const = 0; + // + // + //! \brief Accesseur retournant la chaîne de caractères correspondant à + //! la règle courante. + //! + //! \details La chaîne de caractères est de la forme "B###/S###". + //! + //! \return La chaîne de caractères correspondant à la règle courante selon + //! le format `B###.../S###...`. + virtual std::string rule() const = 0; + // + // + //! \brief Accesseur retournant la stratégie courante de gestion des bords. + //! + //! \return La stratégie courante de gestion des bords. + virtual BorderManagement borderManagement() const = 0; + // + // + //! \brief Accesseur retournant la couleur d'un état. + //! + //! \details Cette fonction retourne la couleur associée à l'état passé + //! en argument. + //! + //! \param state L'état dont on veut connaître la couleur. + //! \return La couleur associée à l'état. + virtual Color color(State state) const = 0; + // + // + //! \brief Accesseurs retournant des informations générales sur la + //! simulation en cours. + //! + //! \details Retourne plusieurs informations sur la simulation. Chaque + //! valeur est optionnelle et peut être indéterminée. + //! + //! Voir la documentation liée à la structure Statistics pour plus de détails. + //! + //! Toutefois, les tendances sont définies ainsi : + //! - La tendance indique la variation entre le nombre de cellules mortes + //! et vivantes en valeur absolue et relative. + //! - Une tendance est à la hausse s'il y a plus de cellules naissantes + //! que mourantes. + //! - Un premier caractères indique si la tendance est à la hausse (+) ou + //! à la baisse (-). + //! - La tendance doit se faire sur un certain nombre d'itérations. Ce + //! nombre est défini par l'implémentation mais doit être supérieur à 10 + //! itérations. L'objectif est d'avoir une lecture relativement stable de + //! la tendance afin qu'elle soit agréable à lire dans l'interface usager. + //! - Optionnellement, vous pouvez ajouter un second caractère indiquant + //! la stabilité de la tendance. Voici la légende : + //! - '-' : stable + //! - '~' : légèrement instable + //! - 'w' : instable + //! - 'W' : très instable + //! + //! \return Une structure contenant les informations sur la simulation. + virtual Statistics statistics() const = 0; + // + // + //! \brief Accesseurs retournant les informations sur la réalisation + //! de l'implémentation. + //! + //! \details Retourne plusieurs informations sur la réalisation de + //! l'implémentation. Chaque valeur est optionnelle et peut être + //! indéterminée. + //! + //! En quelque sorte, c'est l'approche utilisée pour produire un mini + //! rapport utilitaire. + //! + //! Voir la documentation liée à la structure ImplementationInformation + //! pour plus de détails. + //! + //! Pour les réponses 'answers', l'objectif est d'utiliser clairement le + //! vocabulaire technique approprié tout en étant très concis et très précis. + //! + //! \return Une structure contenant les informations sur la réalisation + virtual ImplementationInformation information() const = 0; + // + // + // __ __ _ _ + // | \/ |_ _| |_ __ _| |_ ___ _ _ _ __ ___ + // | |\/| | | | | __/ _` | __/ _ \ | | | '__/ __| + // | | | | |_| | || (_| | || __/ |_| | | \__ \ + // |_| |_|\__,_|\__\__,_|\__\___|\__,_|_| |___/ + // + // + //! \brief Mutateur modifiant la taille de la grille de simulation. + //! + //! \details Cette fonction réinitialise la taille et le contenu de la + //! grille. La taille est spécifié peut être 0 x 0. Le contenu de la + //! grille est entièrement mis à l'état passé en argument. + //! + //! Cette fonction s'assure que si l'une des dimensions est 0, alors les + //! deux sont mises à 0. + //! + //! L'ancient motif de la grille est perdu. L'itération courante est remise + //! à 0. + //! + //! \param width La nouvelle largeur de la grille. + //! \param height La nouvelle hauteur de la grille. + //! \param defaultState L'état d'initialisation des cellules. + virtual void resize(size_t width, size_t height, State defaultState = State::dead) = 0; + // + // + //! \brief Mutateur modifiant la règle de la simulation. + //! + //! \details Cette fonction s'assure que la chaîne de caractères est valide + //! et assigne la nouvelle règle pour que les prochaines évolutions + //! l'utilisent. + //! + //! Si la règle est valide, on assigne la novuelle règle, l'ancienne règle + //! est perdue et l'itération courante est remise à 0. Si la règle est + //! invalide, on ne fait rien. + //! + //! La simulation doit être en mesure de supporté les règles valides. + //! + //! Les règles sont définies par une chaîne de caractère suivant ce format: + //! `B###.../S###...`, par exemple : `B3/S23`. + //! - La lettre `B` (minuscule ou majuscule) débute la section 'B'orn + //! concernant les états morts qui naissent + //! - Suit une série de _n_ caractères pouvant contenir une instance de + //! chacun de ces caractères : '0', '1', '2', '3', '4', '5', '6', '7', '8'. + //! La valeur de _n_ peut varier de 0 à 9. Cette séquence indique toutes + //! les combinaisons du nombre de cellules voisines vivantes qui font + //! naître une cellule morte. + //! - Le caractère barre oblique `/` (_slash_) qui indique la transition + //! vers la section suivante. + //! - La lettre `S` (minuscule ou majuscule) débute la section 'S'urvive + //! concernant les états vivants qui survivent (qui restent vivantes). + //! - Suit une série de _n_ caractères pouvant contenir une instance de + //! chacun de ces caractères : '0', '1', '2', '3', '4', '5', '6', '7', '8'. + //! La valeur de _n_ peut varier de 0 à 9. Cette séquence indique toutes + //! les combinaisons du nombre de cellules voisines vivantes qui font + //! naître une cellule morte. + //! + //! Par exemple : `B02/S1357` indique que : + //! - si une cellule est morte : + //! - elle naît se elle possède 0 ou 2 voisins vivants + //! - si la cellule est vivante : + //! - elle survie si elle possède 1, 3, 5 ou 7 voisins vivants + //! + //! La règle de Conway `B3/S23` est celle par défaut. + virtual bool setRule(std::string const & rule) = 0; + // + // + //! \brief Mutateur modifiant la stratégie de gestion de bord. + //! + //! \details Cette fonction assigne la nouvelle stratégie pour que les + //! prochaines évolutions l'utilisent. + //! + //! L'ancienne stratégie est perdue. L'itération courante est remise à 0. + //! + //! Vous devez être en mesure de gérer les effets de bord selon 5 + //! stratégies différentes : + //! - BorderManagement::immutableAsIs : immuable tel quel. Les cellules + //! du contour ne sont jamais modifiées. + //! - BorderManagement::foreverDead : mort pour toujours. Les cellules + //! du contour ne sont jamais modifiées, elles sont toujours mortes. + //! - BorderManagement::foreverAlive : vivant pour toujours. Les cellules + //! du contour ne sont jamais modifiées, elles sont toujours vivantes. + //! - BorderManagement::warping : téléportation. Les cellules du contour + //! sont évaluées. On utilise les cellules du côté opposé de la grille + //! pour les cellules extérieures. + //! - BorderManagement::mirror : miroir. Les cellules du contour sont + //! évaluées. On utilise les cellules du côté opposé de la cellule pour + //! les cellules extérieures. + //! + //! Pour les 2 exemples suivants, la cellule analysée `-*-` possède 3 + //! voisins situés à l'extérieur de la grille 'x', 'y' et 'z'. Ces cellules + //! sont substituées par les voisins opposés 'X', 'Y' et 'Z'. + //! + //! BorderManagement::warping utilise les voisins opposés par rapport à la + //! **grille**. + //! + //!
    +	//!     +---+---+---+---+---+ 
    +	//!   x | 	|	|	|	| X |
    +	//!     +---+---+---+---+---+
    +	//!   y |-*-|   |	|	| Y |
    +	//!     +---+---+---+---+---+
    +	//!   z |	|	|	|	| Z |
    +	//! 
    + //! + //! BorderManagement::mirror utilise les voisins opposés par rapport à la + //! **cellule**. + //! + //!
    +	//!     +---+---+---+---+---+ 
    +	//!   x | 	| X |	|	|   |
    +	//!     +---+---+---+---+---+
    +	//!   y |-*-| Y |	|	|   |
    +	//!     +---+---+---+---+---+
    +	//!   z |	| Z |	|	|   |
    +	//! 
    + //! + //! \param borderManagement La nouvelle stratégie de gestion de bord. + virtual void setBorderManagement(BorderManagement borderManagement) = 0; + // + // + //! \brief Mutateur modifiant l'état d'une cellule de la grille. + //! + //! \details Cette fonction ne valide pas les entrées pour une raison de + //! performance. L'origine est le coin supérieur gauche de la grille. + //! + //! \param x La coordonnée en x de la cellule. + //! \param y La coordonnée en y de la cellule. + //! \param state Le nouvel état de la cellule. + virtual void setState(int x, int y, State state) = 0; + // + // + //! \brief Mutateur remplissant de façon uniforme toutes les cellules de + //! la grille. + //! + //! \details Cette fonction remplit toutes les cellules de la grille avec + //! l'état passé en argument. + //! + //! L'itération courante est remise à 0. + //! + //! \param state L'état d'initialisation des cellules. + virtual void fill(State state = State::dead) = 0; + // + // + //! \brief Mutateur remplissant de façon alternée toutes les cellules de + //! la grille. + //! + //! \details Cette fonction remplit toutes les cellules de la grille avec + //! un motif en damier. La première cellule, en haut à gauche, est de + //! l'état passée en argument. + //! + //! L'itération courante est remise à 0. + //! + //! \param firstCell L'état de la première cellule. + virtual void fillAlternately(State firstCell = State::dead) = 0; + // + // + //! \brief Mutateur remplissant de façon aléatoire toutes les cellules de + //! la grille. + //! + //! \details Cette fonction remplit toutes les cellules de la grille avec + //! un motif aléatoire. Le pourcentage de probabilité d'une cellule d'être + //! vivante est passé en argument. + //! + //! L'itération courante est remise à 0. + //! + //! \param percentAlive Le pourcentage de probabilité d'une cellule d'être + //! vivante. La valeur doit être comprise entre 0.0 et 1.0 inclusivement. + virtual void randomize(double percentAlive = 0.5) = 0; + // + // + //! \brief Mutateur remplissant la grille par le patron passé en argument. + //! + //! \details Cette fonction remplit la grille avec le patron donné. Le + //! patron est centré sur la coordonnées (centerX, centerY). + //! + //! Le patron respecte un format précis. Se référer à l'énoncé pour voir + //! tous les détails. + //! + //! Si le patron n'est pas valide, la grille n'est pas modifiée et on + //! retourne false. Sinon, on retourne vrai. + //! + //! L'itération courante est remise à 0. + //! + //! \param pattern Le patron à appliquer. + //! \param centerX La coordonnée en x de la grille où se trouve centré le patron. + //! \param centerY La coordonnée en y de la grille où se trouve centré le patron. + //! \return true si le patron est valide, false sinon. + virtual bool setFromPattern(std::string const & pattern, int centerX, int centerY) = 0; + // + // + //! \brief Mutateur remplissant la grille par le patron passé en argument. + //! + //! \details Cette fonction est une surcharge utilitaire de la fonction + //! setFromPattern(std::string const & pattern, int centerX, int centerY). + //! Cette version utilise le centre de la grille comme centre du patron. + //! + //! L'itération courante est remise à 0. + //! + //! \param pattern Le patron à appliquer. + //! \return true si le patron est valide, false sinon. + virtual bool setFromPattern(std::string const & pattern) = 0; + // + // + //! \brief Mutateur modifiant la couleur d'un état. + //! + //! \details Cette fonction modifie la couleur d'un état. + //! + //! Formellement, cette fonction ne modifie rien en soit mais plutôt + //! permet de stocker quelle couleur utiliser pour représenter un état + //! lors de l'affichage de la grille sur une image. + //! + //! \param state L'état dont on veut modifier la couleur. + //! \param color La nouvelle couleur de l'état. + virtual void setSolidColor(State state, Color const & color) = 0; + + + // + // + // __ __ _ _ __ _ _ + // | \/ | ___ __| (_)/ _(_) ___ __ _| |_ ___ _ _ _ __ ___ + // | |\/| |/ _ \ / _` | | |_| |/ __/ _` | __/ _ \ | | | '__/ __| + // | | | | (_) | (_| | | _| | (_| (_| | || __/ |_| | | \__ \ + // |_| |_|\___/ \__,_|_|_| |_|\___\__,_|\__\___|\__,_|_| |___/ + // + //! \brief Fonction effectuant une itération de la simulation. + //! + //! \details Cette fonction constitue la partie centrale de la simulation. + //! Elle est responsable de faire évoluer la grille d'une itération. + //! + //! Cette fonction doit appliquer la logique de l'automate cellulaire en + //! tenant compte pour chaque cellule : + //! - de la grille + //! - de l'état de chacune des cellules voisines + //! - de la règle de la simulation + //! - de la stratégie de gestion de bord + //! + //! Après l'appel de cette fonction, la grille est mise à jour avec le + //! nouvel état de chaque cellule suivant l'état précédent. Les statistiques + //! doivent tenir compte de cette évolution. + virtual void processOneStep() = 0; + // + // + //! \brief Fonction dessinant l'état de la simulation sur une image passée + //! en paramètre. + //! + //! \details Cette fonction dessine l'état courant de chaque cellule sur + //! l'image donnée. Chaque pixel de l'image correspond à une cellule de + //! la grille de simulation. + //! + //! La couleur de chaque pixel est déterminée par la couleur associée à + //! l'état de la cellule. + //! + //! L'organisation en mémoire est ce qu'on appel 'Packed Pixel' suivant + //! l'ordre ARGB. Ainsi, toutes les données d'un pixel est contiguë en + //! mémoire. Les 4 canaux de couleurs sont stockés dans un entier non + //! signé de 32 bits. Chaque canal est codé sur 8 bits. Le canal alpha est + //! le plus significatif et le canal bleu est le moins significatif. + //! + //! La variable buffer pointe vers un tableau de pixels de taille + //! buffer_size. La taille de l'image est donc buffer_size / sizeof(uint32_t). + //! + //!
    +	//! [           32 bits            ]
    +	//! [8 bits][8 bits][8 bits][8 bits]
    +	//! [alpha ][red   ][green ][blue  ]
    +	//! [alpha ][rouge ][vert  ][bleu  ]
    +	//! 
    + //! + //! Vous pouvez considérer que l'image a été créée avec le format de + //! Qt QImage::Format_ARGB32. + //! + //! Il est attendu que vous fassiez une validation minimum des intrants. + //! + //! \param buffer Le tableau de pixels de l'image. + //! \param buffer_size La taille du tableau de pixels. + virtual void updateImage(uint32_t * buffer, size_t buffer_size) const = 0; + +}; + + + + + + + +// +// _ _ _ +// (_)_ __ ___ _ __ ___ _ __| |_ __ _ _ __ | |_ +// | | '_ ` _ \| '_ \ / _ \| '__| __/ _` | '_ \| __| +// | | | | | | | |_) | (_) | | | || (_| | | | | |_ +// |_|_| |_| |_| .__/ \___/|_| \__\__,_|_| |_|\__| +// |_| +// +// Attention, vous devez implémenter et utiliser une classe Grid. +// +// L'ébauche sous forme de commentaire plus bas est un guide +// semi-contraignant. +// +// Toutefois : +// - Vous DEVEZ implémenter l'interface présentée. +// - Vous POUVEZ ajouter des éléments comme vous le voulez. +// +// > Autrement dit, l'interface proposé est minimum. +// > NÉANMOINS, vous devez garder en tête l'intention générique de +// cette classe et ne pas la spécialiser pour le contexte du projet +// de GOL. Par exemple, si on faisait un copier/coller du code et +// qu'on modifiait le CellType pour autre chose (un Vect2D par exemple), +// alors, tout fonctionnerait et la classe serait encore pertinente. +// D'ailleurs, vous remarquez que c'est le seul endroit où il existe un +// lien entre cette classe et le projet courant. +// +// De plus, vous devez gérer manuellement l'allocation dynamique de la mémoire. +// +// +// class Grid // Classe facilitant la gestion d'un tableau dynamique 2d. +// { // +// public: // +// // Définition des types // +// using CellType = GOL::State; // Correspond au type fondamental de chaque cellule de la grille. +// using DataType = ...; // Correspond à la grille, au conteneur de cellules. À vous de déterminer la structure de données à utiliser. +// // +// // Définition des cosntructeurs / destructeur // +// Grid(); // +// Grid(size_t width, size_t height, CellType initValue = CellType{}); // +// Grid(Grid const&) = delete; // +// Grid(Grid&&) = delete; // +// Grid& operator=(Grid const&) = delete; // +// Grid& operator=(Grid&&) = delete; // +// ~Grid(); // +// // +// // Accesseurs et mutateurs de la grille // +// size_t width() const; // Accesseur retournant la largeur de la grille. +// size_t height() const; // Accesseur retournant la hauteur de la grille. +// size_t size() const; // Accesseur retournant le nombre de cellule de la grille. +// // +// void resize(size_t width, size_t height, CellType initValue = CellType{}); // Mutateur modifiant la taille de la grille et initialise le contenu par la valeur spécifiée. +// // +// // Accesseurs et mutateurs des cellules // +// CellType value(int column, int row) const; // Accesseur retournant la valeur d'une cellule à une certaine coordonnée. Pour une raison de performance, cette fonction NE VALIDE PAS ses entrées. Autrement dit, c'est la responsabilité du programmeur utilisateur de faire ses validations, au risque de 'crasher' le programme. +// void setValue(int column, int row, CellType value); // Mutateur modifiant la valeur d'une cellule à une certaine coordonnée. Pour une raison de performance, cette fonction NE VALIDE PAS ses entrées. Autrement dit, c'est la responsabilité du programmeur utilisateur de faire ses validations, au risque de 'crasher' le programme. +// // +// std::optional at(int column, int row) const; // Accesseur retournant la valeur d'une cellule à une certaine coordonnée. Cette fonction VALIDE ses entrées et retourne un optional nul si la coordonnée est invalide. +// void setAt(int column, int row, CellType value); // Mutateur modifiant la valeur d'une cellule à une certaine coordonnée. Cette fonction VALIDE ses entrées et ne fait rien si la coordonnée est invalide. +// // +// // Accesseurs du "buffer" de la grille. // +// DataType const & data() const; // Accesseur en lecture seule sur le "buffer" de la grille. +// DataType & data(); // Accesseur en lecture/écriture sur le "buffer" de la grille. +// // +// private: // +// // ... // Il y a des attributs essentiels au fonctionnement de cette classe. +// // ... // À vous de les déterminer. +// // ... // +// }; // +// // +// // +// // + + + +#endif // GOL_INTERFACE_H \ No newline at end of file diff --git a/GOLAppLib/header/GOLApp.h b/GOLAppLib/header/GOLApp.h new file mode 100644 index 0000000..6f37f7f --- /dev/null +++ b/GOLAppLib/header/GOLApp.h @@ -0,0 +1,22 @@ +#pragma once + +#include + +#include "GOL.h" + + +class QGOLWidget; + + +class GOLApp : public QMainWindow +{ + Q_OBJECT + +public: + GOLApp(QWidget * parent = nullptr); + + void addEngine(GOL * gol); + +private: + QGOLWidget * mGOLWidget; +}; diff --git a/GPA675Lab1GOL.sln b/GPA675Lab1GOL.sln new file mode 100644 index 0000000..d8a70cf --- /dev/null +++ b/GPA675Lab1GOL.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.7.34221.43 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "GPA675Lab1GOL", "GPA675Lab1GOL\GPA675Lab1GOL.vcxproj", "{37D03CB9-506A-4E0B-8BF7-4E23C5A259C5}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {37D03CB9-506A-4E0B-8BF7-4E23C5A259C5}.Debug|x64.ActiveCfg = Debug|x64 + {37D03CB9-506A-4E0B-8BF7-4E23C5A259C5}.Debug|x64.Build.0 = Debug|x64 + {37D03CB9-506A-4E0B-8BF7-4E23C5A259C5}.Release|x64.ActiveCfg = Release|x64 + {37D03CB9-506A-4E0B-8BF7-4E23C5A259C5}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {A4E515A1-A599-4612-8838-985A8FF43284} + EndGlobalSection +EndGlobal diff --git a/GPA675Lab1GOL/GPA675Lab1GOL.qrc b/GPA675Lab1GOL/GPA675Lab1GOL.qrc new file mode 100644 index 0000000..16e10ff --- /dev/null +++ b/GPA675Lab1GOL/GPA675Lab1GOL.qrc @@ -0,0 +1,4 @@ + + + + diff --git a/GPA675Lab1GOL/GPA675Lab1GOL.vcxproj b/GPA675Lab1GOL/GPA675Lab1GOL.vcxproj new file mode 100644 index 0000000..02b1573 --- /dev/null +++ b/GPA675Lab1GOL/GPA675Lab1GOL.vcxproj @@ -0,0 +1,125 @@ + + + + + + Debug + x64 + + + Release + x64 + + + + {37D03CB9-506A-4E0B-8BF7-4E23C5A259C5} + QtVS_v304 + 10.0 + 10.0.22621.0 + $(MSBuildProjectDirectory)\QtMsBuild + + + + Application + v143 + + + Application + v143 + + + + + + + 6.6.1_msvc2019_64 + core;gui;widgets + debug + + + 6.6.1_msvc2019_64 + core;gui;widgets + release + + + + + + + + + + + + + + + + + + + + + + %(AdditionalIncludeDirectories);$(Qt_INCLUDEPATH_);$(SolutionDir)/GOLAppLib/header/ + stdcpp20 + + + $(SolutionDir)/GOLAppLib/lib/$(Platform)/$(Configuration)/ + %(AdditionalDependencies);$(Qt_LIBS_);GOLEngine.lib;GOLAppLib.lib; + + + + + %(AdditionalIncludeDirectories);$(Qt_INCLUDEPATH_);$(SolutionDir)/GOLAppLib/header/ + stdcpp20 + + + $(SolutionDir)/GOLAppLib/lib/$(Platform)/$(Configuration)/ + $(CoreLibraryDependencies);%(AdditionalDependencies);GOLEngine.lib;GOLAppLib.lib; + + + + + true + true + ProgramDatabase + Disabled + + + Windows + true + + + + + true + true + None + MaxSpeed + + + Windows + false + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/GPA675Lab1GOL/GPA675Lab1GOL.vcxproj.filters b/GPA675Lab1GOL/GPA675Lab1GOL.vcxproj.filters new file mode 100644 index 0000000..28f2e1c --- /dev/null +++ b/GPA675Lab1GOL/GPA675Lab1GOL.vcxproj.filters @@ -0,0 +1,43 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + qml;cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + qrc;rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + {99349809-55BA-4b9d-BF79-8FDBB0286EB3} + ui + + + {639EADAA-A684-42e4-A9AD-28FC9BCB8F7C} + ts + + + + + Resource Files + + + + + Source Files + + + Source Files + + + + + Header Files + + + \ No newline at end of file diff --git a/GPA675Lab1GOL/Grid.cpp b/GPA675Lab1GOL/Grid.cpp new file mode 100644 index 0000000..0dabbe9 --- /dev/null +++ b/GPA675Lab1GOL/Grid.cpp @@ -0,0 +1,74 @@ +#include "Grid.h" +#include "GOL.h" + +Grid::Grid() + : Grid(100, 100, CellType::alive) +{ +} + +Grid::Grid(size_t width, size_t height, CellType initValue) +{ + resize(width, height, initValue); +} + +Grid::~Grid() +{ +} + +size_t Grid::width() const +{ + return mWidth; +} + +size_t Grid::height() const +{ + return mHeight; +} + +size_t Grid::size() const +{ + return mWidth * mHeight; +} + +void Grid::resize(size_t width, size_t height, CellType initValue) +{ + mData.reserve(width * height); + mWidth = width; + mHeight = height; +} + +Grid::CellType Grid::value(int column, int row) const +{ + return mData[(column - 1) * (row - 1)]; +} + +void Grid::setValue(int column, int row, CellType value) +{ + mData[(column - 1) * (row - 1)] = value; +} + +std::optional Grid::at(int column, int row) const +{ + if (column > mWidth || row > mHeight) + return std::nullopt; + + return mData[(column - 1) * (row - 1)]; +} + +void Grid::setAt(int column, int row, CellType value) +{ + if (column > mWidth || row > mHeight) + return; + + mData[(column - 1) * (row - 1)] = value; +} + +Grid::DataType const& Grid::data() const +{ + return mData; +} + +Grid::DataType& Grid::data() +{ + return mData; +} diff --git a/GPA675Lab1GOL/Grid.h b/GPA675Lab1GOL/Grid.h new file mode 100644 index 0000000..35ea5f3 --- /dev/null +++ b/GPA675Lab1GOL/Grid.h @@ -0,0 +1,43 @@ +#pragma once + +#include +#include "GOL.h" + +class Grid // Classe facilitant la gestion d'un tableau dynamique 2d. +{ // +public: // + // Définition des types // + using CellType = GOL::State; // Correspond au type fondamental de chaque cellule de la grille. + using DataType = std::vector; // Correspond à la grille, au conteneur de cellules. À vous de déterminer la structure de données à utiliser. + // + // Définition des constructeurs / destructeur // + Grid(); // + Grid(size_t width, size_t height, CellType initValue = CellType{}); // + Grid(Grid const&) = delete; // + Grid(Grid&&) = delete; // + Grid& operator=(Grid const&) = delete; // + Grid& operator=(Grid&&) = delete; // + ~Grid(); // + // + // Accesseurs et mutateurs de la grille // + size_t width() const; // Accesseur retournant la largeur de la grille. + size_t height() const; // Accesseur retournant la hauteur de la grille. + size_t size() const; // Accesseur retournant le nombre de cellule de la grille. + // + void resize(size_t width, size_t height, CellType initValue = CellType{}); // Mutateur modifiant la taille de la grille et initialise le contenu par la valeur spécifiée. + // + // Accesseurs et mutateurs des cellules // + CellType value(int column, int row) const; // Accesseur retournant la valeur d'une cellule à une certaine coordonnée. Pour une raison de performance, cette fonction NE VALIDE PAS ses entrées. Autrement dit, c'est la responsabilité du programmeur utilisateur de faire ses validations, au risque de 'crasher' le programme. + void setValue(int column, int row, CellType value); // Mutateur modifiant la valeur d'une cellule à une certaine coordonnée. Pour une raison de performance, cette fonction NE VALIDE PAS ses entrées. Autrement dit, c'est la responsabilité du programmeur utilisateur de faire ses validations, au risque de 'crasher' le programme. + // + std::optional at(int column, int row) const; // Accesseur retournant la valeur d'une cellule à une certaine coordonnée. Cette fonction VALIDE ses entrées et retourne un optional nul si la coordonnée est invalide. + void setAt(int column, int row, CellType value); // Mutateur modifiant la valeur d'une cellule à une certaine coordonnée. Cette fonction VALIDE ses entrées et ne fait rien si la coordonnée est invalide. + // + // Accesseurs du "buffer" de la grille. // + DataType const & data() const; // Accesseur en lecture seule sur le "buffer" de la grille. + DataType & data(); // Accesseur en lecture/écriture sur le "buffer" de la grille. + // +private: // + DataType mData; // Il y a des attributs essentiels au fonctionnement de cette classe. + size_t mWidth, mHeight; // À vous de les déterminer. +}; \ No newline at end of file diff --git a/GPA675Lab1GOL/main.cpp b/GPA675Lab1GOL/main.cpp new file mode 100644 index 0000000..7a9b164 --- /dev/null +++ b/GPA675Lab1GOL/main.cpp @@ -0,0 +1,27 @@ + +#include + +#include "GOLApp.h" + + + + +int main(int argc, char* argv[]) +{ + QApplication application(argc, argv); + + GOLApp window; + + // + // Ajouter votre implémentation ici. + // Évidemment, n'oubliez pas de faire l'inclusion du fichier contenant + // votre classe. + // + // Par exemple : + // + // window.addEngine(new MonImplementationGOL); + // + + window.show(); + return application.exec(); +}