package lectures.deep_shallow_copy;
import util.annotations.WebDocuments;

import lectures.inheritance.extra.MutablePoint;
import lectures.inheritance.is_a.extra.AMutablePoint;

@WebDocuments({"Lectures/DeepShallowCopy.pptx", "Lectures/DeepShallowCopy.pdf", "Videos/DeepShallowCopy.avi"})
public class CopyExamples {
    public static void assignmentIsNotCopy() {
        MutablePoint p1 = new AMutablePoint(200, 200);
        MutablePoint p2 = p1;
        p1.setX (100);
        System.out.println(p2.getX() == p1.getX());     
    }
    
    public static void userCopies() {
        MutablePoint p1 = new AMutablePoint(200, 200);
        MutablePoint p2 = new AMutablePoint (p1.getX(), p1.getY());
        p1.setX (100);
        System.out.println(p2.getX() == p1.getX());     
    }
    
    public static void pointDefaultCopy() {
        CloneablePoint p1 = new ACloneablePoint(200, 200);
        CloneablePoint p2 = (CloneablePoint) p1.clone();  
        p1.setX (100);
        System.out.println(p2.getX() == p1.getX()); 
    }
    public static void boundedPointDefaultCopy() {
        CloneableBoundedPoint p1 = new ACloneableBoundedPoint (75, 75,  
                  new ACloneablePoint(50,50), new ACloneablePoint(100,100));
        CloneableBoundedPoint p2 = (CloneableBoundedPoint) p1.clone();  
        p1.setX (100);
        p1.getUpperLeftCorner().setX(200);
        System.out.println(p2.getX() == p1.getX()); 
        System.out.println(p1.getUpperLeftCorner().getX() == p2.getUpperLeftCorner().getX());       
    }
    public static void boundedPointDeepCopy() {
        CloneableBoundedPoint p1 = new ACloneableBoundedPoint (75, 75,  
                  new ACloneablePoint(50,50), new ACloneablePoint(100,100));
        CloneableBoundedPoint p2 =  p1.deepCopy();  
        p1.setX (100);
        p1.getUpperLeftCorner().setX(200);
        System.out.println(p2.getX() == p1.getX()); 
        System.out.println(p1.getUpperLeftCorner().getX() == p2.getUpperLeftCorner().getX());       
    }
    public static void graphBoundedPointDeepCopy() {
        CloneableBoundedPoint p1 = new ACloneableBoundedPoint (75, 75,  
                  new ACloneablePoint(50,50), new ACloneablePoint(100,100));
        p1.setUpperLeftCorner(p1);
        CloneableBoundedPoint p2 =  p1.deepCopy();  
        p1.setX (100);
        p1.getUpperLeftCorner().setX(200);
        System.out.println(p2.getX() == p1.getX()); 
        System.out.println(p1.getUpperLeftCorner().getX() == p2.getUpperLeftCorner().getX());       
    }
    public static void printGraphArray() {
        Object[] recursive = new Object[1];
        recursive[0] = recursive;
        System.out.println(recursive);
                
    }
}