1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2026-01-16 10:35:35 -05:00
sdrangel/.github/instructions/cpp.instructions.md
2025-12-22 11:51:45 +01:00

6.6 KiB

applyTo
applyTo
**/*.cpp, **/*.h, **/*.hpp, **/*.cxx, **/*.cc

Qt C++ & SDRangel App coding conventions and guidelines

These instructions guide Copilot to generate code that aligns with modern Qt C++ standards, C++20/23 features, software engineering principles, and industry best practices to improve software quality, maintainability, and performance for the SDRangel application.

General C++ Coding Standards

  • Follow Google C++ Style Guide or Core Guidelines for consistent code structure
  • Use meaningful, descriptive variable, function, class, and file names
  • Apply proper Doxygen comments for classes, methods, and complex logic
  • Organize code into small, reusable functions or classes with single responsibility
  • Avoid magic numbers or hard-coded strings; use constants, enums, or configuration
  • Use RAII (Resource Acquisition Is Initialization) for all resource management
  • Prefer const correctness throughout the codebase

Modern C++20/23 Best Practices

  • Use auto for type deduction when it improves readability
  • Utilize smart pointers (std::unique_ptr, std::shared_ptr) over raw pointers
  • Apply range-based for loops instead of traditional iterator loops
  • Use constexpr for compile-time constants and functions
  • Leverage structured bindings for tuple/pair unpacking
  • Use std::optional for optional values instead of null pointers
  • Apply concepts for template constraints where applicable
  • Use std::span for safe array/container views
  • Utilize std::string_view for read-only string parameters
  • Apply designated initializers for struct initialization
  • Use nodiscard attribute for functions whose return values shouldn't be ignored

Qt Framework Standards & Conventions

  • Follow Qt's CamelCase naming convention for classes and camelCase for methods/variables
  • Use Qt's parent-child ownership model for automatic memory management
  • Apply Q_OBJECT macro for classes that need signals/slots or meta-object features
  • Use signals and slots for loose coupling between components
  • Prefer Qt containers (QVector, QHash, QSet) over STL containers when integrating with Qt APIs
  • Use Qt's foreach or range-based for loops with Qt containers
  • Apply Qt's string handling (QString, QStringView) for Unicode support
  • Use QPointer for safe weak references to QObjects

Project Structure & File Organization

  • Header files should:
    • Use include guards
    • Forward declare classes when possible
    • Separate public, protected, and private sections clearly
  • Source files should:
    • Include corresponding header files first
    • Group includes: standard library, Qt headers, project headers
  • Organize classes into namespaces when necessary to avoid name collisions
  • Maintain a clear separation between interface (header) and implementation (source) files

Qt-Specific Patterns for SDRangel

  • Main Application Structure:

    • Implement proper application lifecycle management
    • Use QSettings for persistent configuration storage
  • Data Collection & Monitoring:

    • Use QTimer for periodic data collection
    • Apply QThread or QRunnable for background processing
    • Use QMutex or QReadWriteLock for thread synchronization
    • Implement QFileSystemWatcher for file monitoring
  • UI Components:

    • Use QMainWindow as the primary window class
    • Apply QWidget customization for specialized displays
    • Use QCharts for data visualization
    • Implement QSystemTrayIcon for background operation
    • Use QDialog for settings and configuration windows
  • Networking & API Integration:

    • Use QNetworkAccessManager for HTTP requests
    • Apply QNetworkReply for handling responses
    • Use QJsonDocument and QJsonObject for JSON parsing
    • Implement proper SSL/TLS handling with QSslConfiguration

Performance & Memory Management

  • Use Qt's object ownership system to prevent memory leaks
  • Apply lazy initialization for expensive resources
  • Use QObject::deleteLater() for safe object deletion
  • Implement efficient string operations with QStringBuilder
  • Use QCache for frequently accessed data
  • Apply QPixmapCache for image caching
  • Optimize paint events with proper clipping and caching

Cross-Platform Development

  • Use Qt's platform abstraction instead of platform-specific code
  • Apply conditional compilation sparingly with Q_OS_* macros
  • Use QStandardPaths for platform-appropriate file locations
  • Implement platform-specific features through Qt's platform plugins
  • Apply High DPI scaling support with Qt::AA_EnableHighDpiScaling

Modern Qt Features to Leverage

  • Use Qt Quick for modern, fluid UIs where appropriate
  • Apply Qt Concurrent for parallel processing
  • Use Qt State Machine for complex state management
  • Apply Qt's logging framework with categories
  • Use Qt's property system for dynamic behavior
  • Apply Qt's animation framework for smooth transitions

Code Quality & Maintainability

  • Follow SOLID Principles adapted for Qt:

    • Single Responsibility: Each class has one clear purpose
    • Open/Closed: Use Qt's plugin system for extensions
    • Liskov Substitution: Proper inheritance hierarchies
    • Interface Segregation: Use Qt's abstract base classes
    • Dependency Inversion: Use Qt's dependency injection patterns
  • Apply Qt's Model-View patterns for data presentation

  • Use Qt's undo framework for user actions

  • Implement proper error handling with Qt's exception safety

  • Apply const correctness especially with Qt's implicit sharing

Additional Copilot Behavior Preferences

  • Generate const-correct, modern C++ code using Qt idioms
  • Prioritize readable, maintainable code over premature optimization
  • Avoid deprecated Qt APIs; use modern alternatives
  • Suggest proper class placement based on Qt application structure
  • Default to Qt's memory management and RAII patterns
  • Include thread safety considerations for multi-threaded operations
  • Consider platform differences when suggesting system-level code
  • Provide Doxygen-style documentation for complex functions
  • Suggest unit tests alongside new features where applicable
  • Use Qt's internationalization support for user-facing strings
  • Be direct and concise in code comments; avoid unnecessary verbosity
  • Avoid starting responses with "Sure!", "You're right!" or similar phrases; be direct and concise.
  • When writing text that'll be visible to users, use clear, professional language without unnecessary exclamations or informalities. Also use Sentence case for titles and headings.