diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md new file mode 100644 index 0000000..c8624ad --- /dev/null +++ b/.github/copilot-instructions.md @@ -0,0 +1,84 @@ +# GitHub Copilot Instructions for GSL (Guidelines Support Library) + +## Project Overview +This repository contains the Guidelines Support Library (GSL), a Microsoft implementation of types and functions +suggested for use by the C++ Core Guidelines. It's a header-only C++ library with emphasis on safety, +correctness, and zero overhead. + +## Coding Standards + +### General +- Follow C++ Core Guidelines wherever possible +- Use meaningful type, function, and template parameter names +- Keep functions small and focused with clear preconditions/postconditions +- Include comments for complex code, but prefer self-documenting code +- Use the Expects() and Ensures() macros for contract verification + +### Style Guidelines +- Use 4 spaces for indentation (not tabs) +- Maximum line length of 100 characters +- Follow GSL naming conventions (lowercase with underscores) +- Keep templates clean and readable with appropriate spacing +- Use C++14 features since this is the minimum standard supported + +### Error Handling +- Use Expects() for preconditions and Ensures() for postconditions +- Design for fail-fast semantics (std::terminate) on contract violations +- Template constraints should use static_assert or SFINAE +- Don't throw exceptions from basic operations + +### Testing +- Write thorough unit tests for every component using GTest +- Test for all edge cases and error conditions +- Ensure cross-platform compatibility in tests +- Maintain 100% code coverage for changed code + +## Project-Specific Conventions + +### Architecture +- All public types must be in the gsl namespace +- Design for zero overhead abstractions when possible +- Respect the distinction between Owners and Views +- Maintain backward compatibility with existing GSL code + +### Version Control +- Link all PRs to related issues +- Use clear commit messages explaining what and why +- Follow the contribution guidelines documented in CONTRIBUTING.md +- PRs should include appropriate tests with 100% coverage for changed code + +### Documentation +- Document all public APIs with clarity on preconditions and postconditions +- Keep header comments up-to-date +- Include examples for complex functionality in docs/headers.md + +## Technology Stack +- C++14 (minimum) for core implementation +- CMake build system (3.14+) +- Google Test for unit testing +- Support for multiple compilers (MSVC, GCC, Clang) + +## Security Considerations +- Bounds checking is a core principle - enforce it consistently +- Design for safety while minimizing overhead +- Ensure undefined behavior is explicitly detected where possible + +## Performance Guidelines +- Optimize for both safety and performance +- Constexpr-enable functions wherever possible +- Avoid hidden allocations +- Use noexcept appropriately for move operations and other performance-critical functions + +## Cross-Platform Support +- Code must work across: + - Windows (MSVC) + - Linux (GCC, Clang) + - macOS (AppleClang) + - Android and iOS where applicable + +## Copilot Tasks +- You can find the CMake artifacts for C++20 in build-cxx20 and C++14 in build-cxx14. +- Before publishing a PR, verify the following: + - There are no compiler warnings or errors when building the test suite. + - The test suite passes on all supported platforms and compilers. + - The test suite passes for both C++14 and C++20. diff --git a/.github/workflows/copilot-setup-steps.yml b/.github/workflows/copilot-setup-steps.yml new file mode 100644 index 0000000..c410c66 --- /dev/null +++ b/.github/workflows/copilot-setup-steps.yml @@ -0,0 +1,22 @@ +name: "Copilot Setup Steps" + +on: workflow_dispatch + +jobs: + copilot-setup-steps: + runs-on: ubuntu-latest + permissions: + contents: read + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Install Build Dependencies + run: sudo apt-get update && sudo apt-get install -y clang cmake make + + - name: Configure CMake (C++14) + run: cmake -B build-cxx14 . -DGSL_CXX_STANDARD=14 -DGSL_TEST=ON -G "Unix Makefiles" + + - name: Configure CMake (C++20) + run: cmake -B build-cxx20 . -DGSL_CXX_STANDARD=20 -DGSL_TEST=ON -G "Unix Makefiles" +