From 0f7474b594b3d4ded1448a024716c1f5ce127f57 Mon Sep 17 00:00:00 2001
From: Guyslain <guyslain.naves@lis-lab.fr>
Date: Sun, 20 Oct 2024 17:26:58 +0200
Subject: [PATCH] =?UTF-8?q?TD=206=20g=C3=A9n=C3=A9ricit=C3=A9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../fr/univamu/progav/td6/ArrayCellLens.java  | 21 ++++++
 src/main/java/fr/univamu/progav/td6/Box.java  | 20 +++++
 src/main/java/fr/univamu/progav/td6/Lens.java |  6 ++
 .../fr/univamu/progav/td6/ListCellLens.java   | 23 ++++++
 src/main/java/fr/univamu/progav/td6/TD6.md    | 74 +++++++++++++++++++
 .../univamu/progav/td6/ArrayCellLensTest.java | 41 ++++++++++
 .../java/fr/univamu/progav/td6/BoxTest.java   | 40 ++++++++++
 .../univamu/progav/td6/ListCellLensTest.java  | 41 ++++++++++
 8 files changed, 266 insertions(+)
 create mode 100644 src/main/java/fr/univamu/progav/td6/ArrayCellLens.java
 create mode 100644 src/main/java/fr/univamu/progav/td6/Box.java
 create mode 100644 src/main/java/fr/univamu/progav/td6/Lens.java
 create mode 100644 src/main/java/fr/univamu/progav/td6/ListCellLens.java
 create mode 100644 src/main/java/fr/univamu/progav/td6/TD6.md
 create mode 100644 src/test/java/fr/univamu/progav/td6/ArrayCellLensTest.java
 create mode 100644 src/test/java/fr/univamu/progav/td6/BoxTest.java
 create mode 100644 src/test/java/fr/univamu/progav/td6/ListCellLensTest.java

diff --git a/src/main/java/fr/univamu/progav/td6/ArrayCellLens.java b/src/main/java/fr/univamu/progav/td6/ArrayCellLens.java
new file mode 100644
index 0000000..daf38e3
--- /dev/null
+++ b/src/main/java/fr/univamu/progav/td6/ArrayCellLens.java
@@ -0,0 +1,21 @@
+package fr.univamu.progav.td6;
+
+public class ArrayCellLens<T> implements Lens<T> {
+
+  // TODO ajouter les propriétés
+
+  public ArrayCellLens(T[] array, int index) {
+    // TODO
+  }
+
+  @Override
+  public T get() {
+    // TODO
+    return null;
+  }
+
+  @Override
+  public void set(T t) {
+    // TODO
+  }
+}
diff --git a/src/main/java/fr/univamu/progav/td6/Box.java b/src/main/java/fr/univamu/progav/td6/Box.java
new file mode 100644
index 0000000..9effbbf
--- /dev/null
+++ b/src/main/java/fr/univamu/progav/td6/Box.java
@@ -0,0 +1,20 @@
+package fr.univamu.progav.td6;
+
+public class Box implements Lens<Integer> {
+
+  private int content;
+
+  public Box(int content) {
+    this.content = content;
+  }
+
+  @Override
+  public void set(Integer newContent) {
+    this.content = newContent;
+  }
+
+  @Override
+  public Integer get() {
+    return this.content;
+  }
+}
diff --git a/src/main/java/fr/univamu/progav/td6/Lens.java b/src/main/java/fr/univamu/progav/td6/Lens.java
new file mode 100644
index 0000000..8dd0c66
--- /dev/null
+++ b/src/main/java/fr/univamu/progav/td6/Lens.java
@@ -0,0 +1,6 @@
+package fr.univamu.progav.td6;
+
+public interface Lens<T> {
+  void set(T t);
+  T get();
+}
diff --git a/src/main/java/fr/univamu/progav/td6/ListCellLens.java b/src/main/java/fr/univamu/progav/td6/ListCellLens.java
new file mode 100644
index 0000000..f433fa8
--- /dev/null
+++ b/src/main/java/fr/univamu/progav/td6/ListCellLens.java
@@ -0,0 +1,23 @@
+package fr.univamu.progav.td6;
+
+import java.util.List;
+
+public class ListCellLens<T> implements Lens<T> {
+
+  // TODO ajouter les propriétés
+
+  public ListCellLens(List<T> list, int index) {
+    // TODO
+  }
+
+  @Override
+  public void set(T t) {
+    // TODO
+  }
+
+  @Override
+  public T get() {
+    // TODO
+    return null;
+  }
+}
diff --git a/src/main/java/fr/univamu/progav/td6/TD6.md b/src/main/java/fr/univamu/progav/td6/TD6.md
new file mode 100644
index 0000000..5e63490
--- /dev/null
+++ b/src/main/java/fr/univamu/progav/td6/TD6.md
@@ -0,0 +1,74 @@
+Ces exercices ont pour sujet une interface `Lens` générique, permettant 
+de représenter un emplacement mémoire autorisant la lecture et l'écriture.
+
+Prendre connaissance de cette interface, qui propose deux méthodes `set`
+et `get`.
+
+
+Exercice 1
+==========
+
+Rendre la classe `Box` générique. Pour l'instant elle implémente un 
+`Lens<Integer>`, mais nous voulons l'utiliser avec d'autres types.
+
+Modifier la méthode de test `genericTest` de la classe `BoxTest` pour qu'elle 
+fonctionne.
+
+Exercice 2
+==========
+
+Étant donné une liste, chaque case de la liste est accessible en lecture et 
+en écriture. Il est donc possible de décrire chaque case avec l'interface 
+`Lens`. Compléter la classe générique `ListCellLens`, prenant une liste et 
+l'indice d'une case en paramètre du constructeur, et représentant la case ainsi 
+désignée.
+
+Vérifiez votre travail à l'aide des tests `ListCellLensTest` associés à la 
+classe.
+
+Exercice 3
+==========
+
+Nous pouvons faire la même chose avec les tableaux. Compléter la classe 
+générique `ArrayCellLens`, prenant un tableau et
+l'indice d'une case en paramètre du constructeur, et représentant la case ainsi
+désignée.
+
+Vérifiez votre travail à l'aide des tests `ArrayCellLensTest` associés à la 
+classe.
+
+Exercice 4
+==========
+
+Si vous essayez d'utiliser `ArrayCellLens` avec un tableau de type `int[]`, 
+cela produit une erreur à la compilation. Pourquoi ?
+
+Ajouter une classe `IntArrayCellLens` pour pouvoir faire un `Lens` sur une 
+case d'un tableau de type `int[]`.
+
+Ajouter un test dans la classe `ArrayCellLensTest`, s'assurant du bon 
+fonctionnement des méthodes `set` et `get` pour une case d'un tableau de 
+type `int[]`
+
+Exercice 5 (Optionnel)
+======================
+
+Nous pouvons utiliser un objet de type `Lens` pour stocker une valeur sous 
+un format compressé. Pour un type `S` (dont les valeurs prennent beaucoup de 
+place), si nous disposons d'une fonction de compression `f` vers un type `T` 
+(nécessitant moins de place), et de son inverse `g`, nous pouvons 
+représenter une valeur `s` de type `S` en stockant uniquement `f(s)`. La 
+méthode `get` applique automatiquement `g` pour retrouver la valeur initiale 
+(de type `S`). La méthode `set` applique automatiquement `f` pour ne stocker 
+qu'une image (de type `T`). Ainsi, nous réduisons l'espace utilisé, en 
+échange d'un coût de calcul des fonctions `f` et `g` `chaque opération.
+
+Ajouter une interface `Bijection` permettant de représenter par deux 
+méthodes les fonctions `f` et `g`.
+
+Ensuite créer une classe `ConvertingLens`, de type `Lens<S>`, et ayant une 
+propriété de type `T`. Le constructeur sera paramétré par la bijection à 
+utiliser.
+
+Tester avec `S = String`, `T = Integer`, en se restreignant aux chaînes de 
+caractères correspondant à des nombres décimaux (comme `"129873"`)
diff --git a/src/test/java/fr/univamu/progav/td6/ArrayCellLensTest.java b/src/test/java/fr/univamu/progav/td6/ArrayCellLensTest.java
new file mode 100644
index 0000000..3fc462d
--- /dev/null
+++ b/src/test/java/fr/univamu/progav/td6/ArrayCellLensTest.java
@@ -0,0 +1,41 @@
+package fr.univamu.progav.td6;
+
+import org.junit.jupiter.api.Test;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+class ArrayCellLensTest {
+
+  @Test
+  void testGet() {
+    Integer[] array = {4, 3, 2, 1};
+    Lens<Integer> lens1 = new ArrayCellLens<>(array, 1);
+    assertEquals(3, lens1.get());
+    array[1] = 5;
+    assertEquals(5, lens1.get());
+  }
+
+  @Test
+  void testSet() {
+    Integer[] array = {4, 3, 2, 1};
+    Lens<Integer> lens1 = new ArrayCellLens<>(array, 1);
+    lens1.set(8);
+    assertEquals(8, lens1.get());
+  }
+
+
+  @Test
+  void testSetModifyArray() {
+    Integer[] array = {4, 3, 2, 1};
+    Lens<Integer> lens1 = new ArrayCellLens<>(array, 1);
+    lens1.set(5);
+    assertEquals(5, lens1.get());
+    assertEquals(5, array[1]);
+    assertEquals(4, array[0]);
+    assertEquals(2, array[2]);
+  }
+
+}
diff --git a/src/test/java/fr/univamu/progav/td6/BoxTest.java b/src/test/java/fr/univamu/progav/td6/BoxTest.java
new file mode 100644
index 0000000..890f211
--- /dev/null
+++ b/src/test/java/fr/univamu/progav/td6/BoxTest.java
@@ -0,0 +1,40 @@
+package fr.univamu.progav.td6;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+class BoxTest {
+
+  @Test
+  void testGet() {
+    Lens<Integer> box = new Box(0);
+    assertEquals(0,box.get());
+    box = new Box(42);
+    assertEquals(42,box.get());
+  }
+
+  @Test
+  void testSet() {
+    Lens<Integer> box = new Box(0);
+    box.set(3);
+    assertEquals(3,box.get());
+    box.set(5);
+    assertEquals(5,box.get());
+    box.set(-3);
+    assertEquals(-3,box.get());
+  }
+
+
+  @Test
+  void genericBox() {
+    Lens<String> box = null; // TODO créer une boîte contenant "foo"
+    assertEquals("foo", box.get());
+    box.set("bar");
+    assertEquals("bar", box.get());
+    Lens<Lens<Integer>> boxbox = null; // TODO créer une boîte contenant une boîte contenant 0
+    boxbox.get().set(2);
+    assertEquals(2,boxbox.get().get());
+  }
+
+}
\ No newline at end of file
diff --git a/src/test/java/fr/univamu/progav/td6/ListCellLensTest.java b/src/test/java/fr/univamu/progav/td6/ListCellLensTest.java
new file mode 100644
index 0000000..c3d39f2
--- /dev/null
+++ b/src/test/java/fr/univamu/progav/td6/ListCellLensTest.java
@@ -0,0 +1,41 @@
+package fr.univamu.progav.td6;
+
+import org.junit.jupiter.api.Test;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+class ListCellLensTest {
+
+  @Test
+  void testGet() {
+    List<Integer> list = new ArrayList<>(List.of(4,3,2,1));
+    Lens<Integer> lens1 = new ListCellLens<>(list, 1);
+    assertEquals(3, lens1.get());
+    list.set(1,5);
+    assertEquals(5, lens1.get());
+  }
+
+  @Test
+  void testSet() {
+    List<Integer> list = new ArrayList<>(List.of(4,3,2,1));
+    Lens<Integer> lens1 = new ListCellLens<>(list, 1);
+    lens1.set(8);
+    assertEquals(8, lens1.get());
+  }
+
+
+  @Test
+  void testSetModifyList() {
+    List<Integer> list = new ArrayList<>(List.of(4,3,2,1));
+    Lens<Integer> lens1 = new ListCellLens<>(list, 1);
+    lens1.set(5);
+    assertEquals(5, lens1.get());
+    assertEquals(5, list.get(1));
+    assertEquals(4, list.get(0));
+    assertEquals(2, list.get(2));
+  }
+
+}
\ No newline at end of file
-- 
GitLab