/* -----------------------------------------------------------------------------
 * std_array.i
 *
 * SWIG typemaps for std::array<T, N>
 * Lua implementation
 * ----------------------------------------------------------------------------- */

%{
#include <array>
#include <algorithm>
%}

%include <std_common.i>
%include <std_except.i>

/*
 * std::array wrapper for Lua.
 * Note: this is a simplified version that provides basic array functionality.
 * The array is a fixed-size container, so no push_back/pop_back operations.
 */

namespace std {

    template<class T, size_t N>
    class array {
    public:
        typedef size_t size_type;
        typedef ptrdiff_t difference_type;
        typedef T value_type;
        typedef value_type* pointer;
        typedef const value_type* const_pointer;
        typedef value_type& reference;
        typedef const value_type& const_reference;

        array();
        array(const array& other);

        size_type size() const;
        size_type max_size() const;
        bool empty() const;

        void fill(const value_type& value);
        void swap(array& other);

        // Front and back access (read-only for safety, like vector)
        T front() const;
        T back() const;

        %extend {
            // Lua __getitem__ metamethod (1-based indexing internally converts to 0-based)
            T __getitem__(unsigned int idx) throw (std::out_of_range) {
                if (idx >= N)
                    throw std::out_of_range("array index out of range");
                return (*self)[idx];
            }

            // Lua __setitem__ metamethod
            void __setitem__(unsigned int idx, T val) throw (std::out_of_range) {
                if (idx >= N)
                    throw std::out_of_range("array index out of range");
                (*self)[idx] = val;
            }

            // Get element at index with bounds checking
            const T& get(unsigned int idx) throw (std::out_of_range) {
                if (idx >= N)
                    throw std::out_of_range("array index out of range");
                return (*self)[idx];
            }

            // Set element at index with bounds checking
            void set(unsigned int idx, const T& val) throw (std::out_of_range) {
                if (idx >= N)
                    throw std::out_of_range("array index out of range");
                (*self)[idx] = val;
            }

            // Return pointer to first element (for at() style access)
            T at(unsigned int idx) throw (std::out_of_range) {
                if (idx >= N)
                    throw std::out_of_range("array index out of range");
                return (*self)[idx];
            }

            // Reverse the array in place
            void reverse() {
                std::reverse($self->begin(), $self->end());
            }
        }
    };
}

