예제 #1
0
    public t Get(int x, int y)
    {
        /* Fetches an object from the Cartesian Map at (x, y), or returns null if none exist. */
        QuadrantCoordinates quadcoords = ConvertToQuadrants(x, y);
        List <List <t> >    grid       = GetQuadrant(quadcoords.quadrant);

        if (grid.Count <= quadcoords.x || grid[quadcoords.x].Count <= quadcoords.y)
        {
            return(default(t));
        }
        return(grid[quadcoords.x][quadcoords.y]);
    }
예제 #2
0
    public void Insert(int x, int y, t obj)
    {
        /* Inserts an object into the Cartesian Map at (x, y).
         *
         * If caching is enabled, also records that item in a List.
         * If an item is overwritten or deleted, also overwrites or deletes that item from a list.
         */
        QuadrantCoordinates quadcoords = ConvertToQuadrants(x, y);
        List <List <t> >    grid       = GetQuadrant(quadcoords.quadrant);

        while (grid.Count <= quadcoords.x)
        {
            grid.Add(new List <t>());
        }
        while (grid[quadcoords.x].Count <= quadcoords.y)
        {
            grid[quadcoords.x].Add(default(t));
        }
        if (_use_caching)
        {
            /* Caches entries to the list '_all_items'. */
            t old_item = grid[quadcoords.x][quadcoords.y];
            // Inserting a new entry.
            if (!obj.Equals(default(t)) && (old_item == null || old_item.Equals(default(t))))
            {
                CartesianItem cartesian_item = new CartesianItem();
                cartesian_item.x    = x;
                cartesian_item.y    = y;
                cartesian_item.item = obj;
                _all_items.Add(cartesian_item);
            }
            // Replacing an old entry.
            else if (!obj.Equals(default(t)) && (old_item != null && !old_item.Equals(default(t))))
            {
                CartesianItem old_cartesian_item = new CartesianItem()
                {
                    x    = x,
                    y    = y,
                    item = old_item
                };
                int           i = _all_items.FindIndex(entry => entry.Equals(old_cartesian_item));
                CartesianItem new_cartesian_item = new CartesianItem()
                {
                    x    = x,
                    y    = y,
                    item = obj
                };
                _all_items[i] = new_cartesian_item;
            }
            // Deleting an old entry.
            else if (obj.Equals(default(t)) && (old_item != null && !old_item.Equals(default(t))))
            {
                CartesianItem old_cartesian_item = new CartesianItem()
                {
                    x    = x,
                    y    = y,
                    item = old_item
                };
                _all_items.Remove(old_cartesian_item);
            }
            // Ignore deleting a non-existant entry.
        }
        grid[quadcoords.x][quadcoords.y] = obj;
    }