कोड स्टाइल गाइड

HIDL कोड स्टाइल, 4-स्पेस के साथ Android फ़्रेमवर्क में C++ कोड के समान होता है इंडेंट और मिक्स-केस फ़ाइल नाम. पैकेज का एलान, इंपोर्ट, और docstring ये Java में उपलब्ध फ़ाइलों के समान हैं, लेकिन इनमें थोड़े बहुत बदलाव किए गए हैं.

IFoo.hal और types.hal के लिए ये उदाहरण एचआईडीएल कोड स्टाइल के बारे में बताएं और हर स्टाइल की जानकारी के लिए क्विक लिंक दें (IFooClientCallback.hal, IBar.hal, और IBaz.hal हटा दिए गए हैं).

hardware/interfaces/foo/1.0/IFoo.hal
/*
 * (License Notice)
 */

package android.hardware.foo@1.0;

import android.hardware.bar@1.0::IBar;

import IBaz;
import IFooClientCallback;

/**
 * IFoo is an interface that…
 */
interface IFoo {

    /**
     * This is a multiline docstring.
     *
     * @return result 0 if successful, nonzero otherwise.
     */
     foo() generates (FooStatus result);

    /**
     * Restart controller by power cycle.
     *
     * @param bar callback interface that…
     * @return result 0 if successful, nonzero otherwise.
     */
    powerCycle(IBar bar) generates (FooStatus result);

    /** Single line docstring. */
    baz();


    /**
     * The bar function.
     *
     * @param clientCallback callback after function is called
     * @param baz related baz object
     * @param data input data blob
     */
    bar(IFooClientCallback clientCallback,
        IBaz baz,
        FooData data);

};
hardware/interfaces/foo/1.0/types.hal
/*
 * (License Notice)
 */

package android.hardware.foo@1.0;

/** Replied status. */
enum Status : int32_t {
    OK,
    /* invalid arguments */
    ERR_ARG,
    /* note, no transport related errors */
    ERR_UNKNOWN = -1,
};

struct ArgData {
    int32_t[20]  someArray;
    vec<uint8_t> data;
};

नाम रखने के तरीके

फ़ंक्शन के नाम, वैरिएबल के नाम, और फ़ाइलों के नाम में पूरी जानकारी होनी चाहिए; बचें संक्षिप्त नाम. संक्षिप्त तौर पर इस्तेमाल होने वाले शब्दों को शब्द समझें (उदाहरण के लिए, इसके बजाय INfc का इस्तेमाल करें कुल INFC).

डायरेक्ट्री स्ट्रक्चर और फ़ाइल के नाम

डायरेक्ट्री का स्ट्रक्चर इस तरह दिखना चाहिए:

  • ROOT-DIRECTORY
    • MODULE
      • SUBMODULE (ज़रूरी नहीं है, एक से ज़्यादा हो सकते हैं) लेवल)
        • VERSION
          • Android.mk
          • IINTERFACE_1.hal
          • IINTERFACE_2.hal
          • IINTERFACE_N.hal
          • types.hal (वैकल्पिक)

कहाँ:

  • ROOT-DIRECTORY यह है:
    • कोर HIDL पैकेज के लिए hardware/interfaces.
    • वेंडर के पैकेज के लिए vendor/VENDOR/interfaces, जहां VENDOR का मतलब SoC वेंडर या OEM/ODM.
  • MODULE ऐसा छोटा शब्द होना चाहिए जिससे यह जानकारी मिले सबसिस्टम (उदाहरण के लिए, nfc). अगर एक से ज़्यादा शब्दों की ज़रूरत हो, तो नेस्ट किया गया SUBMODULE. इसके एक से ज़्यादा लेवल हो सकते हैं नेस्टिंग.
  • VERSION का वर्शन बिलकुल एक जैसा होना चाहिए (major.minor) डालें, जैसा कि वर्शन में बताया गया है.
  • IINTERFACE_X का इंटरफ़ेस नाम इसके साथ होना चाहिए UpperCamelCase/PascalCase (उदाहरण के लिए, INfc) जैसा कि इंटरफ़ेस के नाम में बताया गया है.

उदाहरण:

  • hardware/interfaces
    • nfc
      • 1.0
        • Android.mk
        • INfc.hal
        • INfcClientCallback.hal
        • types.hal

ध्यान दें: सभी फ़ाइलें ऐसी होनी चाहिए जिन्हें एक्ज़ीक्यूट न किया जा सके अनुमतियां (Git में).

पैकेज के नाम

पैकेज के नामों में, नीचे दी गई सभी शर्तें पूरी करने वाला नाम होना चाहिए (FQN) फ़ॉर्मैट (इसे PACKAGE-NAME कहा जाता है):

PACKAGE.MODULE[.SUBMODULE[.SUBMODULE[…]]]@VERSION

कहाँ:

  • PACKAGE वह पैकेज है जो ROOT-DIRECTORY. खास तौर पर, PACKAGE यह है:
    • कोर HIDL पैकेज के लिए android.hardware (इस पर मैप किया जा रहा है hardware/interfaces).
    • वेंडर पैकेज के लिए vendor.VENDOR.hardware, जहां VENDOR का मतलब है, SoC वेंडर या OEM/ODM (मैपिंग) vendor/VENDOR/interfaces तक).
  • MODULE[.SUBMODULE[.SUBMODULE[…]]]@VERSION अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है फ़ोल्डर के नाम एक जैसे हैं. इनके नाम में डायरेक्ट्री का स्ट्रक्चर.
  • पैकेज के नाम अंग्रेज़ी के छोटे अक्षरों में होने चाहिए. अगर वे एक से ज़्यादा शब्दों के हैं, तो शब्दों का इस्तेमाल सबमॉड्यूल के तौर पर किया जाना चाहिए या इन्हें snake_case में लिखा जाना चाहिए.
  • खाली जगह न छोड़ें.

एफ़क्यूएन का इस्तेमाल हमेशा पैकेज की जानकारी देने के लिए किया जाता है.

वर्शन

वर्शन का फ़ॉर्मैट इस तरह होना चाहिए:

MAJOR.MINOR

MAJOR और MINOR, दोनों वर्शन एक ही होना चाहिए पूर्णांक. HIDL सिमेंटिक का इस्तेमाल करता है वर्शन के नियमों के बारे में ज़्यादा जानें.

इंपोर्ट

इंपोर्ट के इन तीन फ़ॉर्मैट में से कोई एक फ़ॉर्मैट होता है:

  • पूरे पैकेज इंपोर्ट: import PACKAGE-NAME;
  • कुछ हद तक इंपोर्ट: import PACKAGE-NAME::UDT; (या, अगर इंपोर्ट किया गया है) प्रकार समान पैकेज में है,import UDT;
  • सिर्फ़ टाइप के इंपोर्ट: import PACKAGE-NAME::types;

PACKAGE-NAME इस फ़ॉर्मैट का पालन करता है पैकेज के नाम. मौजूदा पैकेज का types.hal (अगर यह मौजूद है) अपने-आप इंपोर्ट हो जाता है (इंपोर्ट न करें) यह साफ़ तौर पर बताया गया है).

पूरी तरह क्वालिफ़ाइड नाम (एफ़क्यूएन)

उपयोगकर्ता-तय टाइप इंपोर्ट के लिए, पूरी तरह क्वालिफ़ाइड नामों का इस्तेमाल करें. हालांकि, ऐसा सिर्फ़ ज़रूरी होने पर ही करें. अगर इंपोर्ट का टाइप समान है, तो PACKAGE-NAME को हटा दें पैकेज. FQN में स्पेस नहीं होना चाहिए. पूरी तरह क्वालिफ़ाइड नाम का उदाहरण:

android.hardware.nfc@1.0::INfcClientCallback

android.hardware.nfc@1.0 से जुड़ी किसी दूसरी फ़ाइल में, इसे देखें INfcClientCallback जैसे इंटरफ़ेस के ऊपर. अगर आपको ऐसा नहीं करना है, तो सिर्फ़ पूरी तरह क्वालिफ़ाइड नाम.

इंपोर्ट को ग्रुप करना और ऑर्डर करना

पैकेज की जानकारी के बाद (इंपोर्ट से पहले) एक खाली लाइन का इस्तेमाल करें. हर इंपोर्ट एक पंक्ति में फैलना चाहिए और इंडेंट नहीं किया जाना चाहिए. ग्रुप इंपोर्ट निम्न क्रम:

  1. अन्य android.hardware पैकेज (पूरी तरह क्वालिफ़ाइड नाम इस्तेमाल करें).
  2. अन्य vendor.VENDOR पैकेज (पूरी तरह क्वालिफ़ाइड इस्तेमाल करें) नाम).
    • हर वेंडर को एक ग्रुप होना चाहिए.
    • वेंडर के नाम को अंग्रेज़ी वर्णमाला के क्रम में लगाएं.
  3. उसी पैकेज में दूसरे इंटरफ़ेस से इंपोर्ट करना (आसान नाम इस्तेमाल करें).

ग्रुप के बीच खाली लाइन का इस्तेमाल करें. हर ग्रुप में, इंपोर्ट को क्रम से लगाएं वर्णमाला के क्रम में. उदाहरण:

import android.hardware.nfc@1.0::INfc;
import android.hardware.nfc@1.0::INfcClientCallback;

/* Importing the whole module. */
import vendor.barvendor.bar@3.1;

import vendor.foovendor.foo@2.2::IFooBar;
import vendor.foovendor.foo@2.2::IFooFoo;

import IBar;
import IFoo;

इंटरफ़ेस के नाम

इंटरफ़ेस के नाम I से शुरू होने चाहिए. इसके बाद UpperCamelCase/PascalCase नाम. नाम वाला इंटरफ़ेस IFoo के बारे में IFoo.hal फ़ाइल में बताया जाना चाहिए. यह फ़ाइल इसमें सिर्फ़ IFoo इंटरफ़ेस (इंटरफ़ेस INAME, INAME.hal में होना चाहिए).

फ़ंक्शन

फ़ंक्शन के नामों, आर्ग्युमेंट, और रिटर्न वैरिएबल के नामों के लिए, lowerCamelCase. उदाहरण:

open(INfcClientCallback clientCallback) generates (int32_t retVal);
oneway pingAlive(IFooCallback cb);

स्ट्रक्ट और यूनियन फ़ील्ड के नाम

स्ट्रक्चर या यूनियन फ़ील्ड के नामों के लिए, lowerCamelCase का इस्तेमाल करें. उदाहरण:

struct FooReply {
    vec<uint8_t> replyData;
}

नाम लिखें

टाइप नेम का इस्तेमाल, स्ट्रक्चर या यूनियन की परिभाषाएं, ईनम टाइप की परिभाषाएं, और typedef. इन नामों के लिए, UpperCamelCase/PascalCase. उदाहरणः

enum NfcStatus : int32_t {
    /*...*/
};
struct NfcData {
    /*...*/
};

Enum वैल्यू

Enum वैल्यू UPPER_CASE_WITH_UNDERSCORES होनी चाहिए. पास होने पर enum मानों को फ़ंक्शन तर्क के रूप में और उन्हें फ़ंक्शन वापस लौटाने के रूप में लौटाता है, इसका उपयोग करें वास्तविक enum प्रकार (बुनियादी पूर्णांक प्रकार नहीं). उदाहरण:

enum NfcStatus : int32_t {
    HAL_NFC_STATUS_OK               = 0,
    HAL_NFC_STATUS_FAILED           = 1,
    HAL_NFC_STATUS_ERR_TRANSPORT    = 2,
    HAL_NFC_STATUS_ERR_CMD_TIMEOUT  = 3,
    HAL_NFC_STATUS_REFUSED          = 4
};

ध्यान दें: ईनम टाइप का बुनियादी टाइप यह है कोलन के बाद साफ़ तौर पर बताया जाता है. क्योंकि यह कंपाइलर पर निर्भर नहीं है, इसलिए ईनम का असल टाइप ज़्यादा साफ़ है.

ईनम वैल्यू के लिए, पूरी तरह क्वालिफ़ाइड नामों के लिए, कोलन का इस्तेमाल किया जाता है ईनम टाइप नाम और ईनम वैल्यू के नाम के बीच सेट करें:

PACKAGE-NAME::UDT[.UDT[.UDT[…]]:ENUM_VALUE_NAME

पूरी तरह क्वालिफ़ाइड नाम के अंदर स्पेस नहीं होने चाहिए. पूरी तरह क्वालिफ़ाइड खाते का इस्तेमाल करें नाम का इस्तेमाल ज़रूरत पड़ने पर ही करें. साथ ही, गै़र-ज़रूरी हिस्सों को हटा दें. उदाहरण:

android.hardware.foo@1.0::IFoo.IFooInternal.FooEnum:ENUM_OK

टिप्पणियां

एक लाइन वाली टिप्पणी के लिए: //, /* */, और /** */ ठीक हैं.

// This is a single line comment
/* This is also single line comment */
/** This is documentation comment */
  • टिप्पणियों के लिए /* */ का इस्तेमाल करें. HIDL, टिप्पणियों के लिए // का इस्तेमाल करता है, लेकिन उन्हें बढ़ावा नहीं दिया जाता, क्योंकि वे जनरेट किए गए आउटपुट में नहीं दिखते.
  • जनरेट किए गए दस्तावेज़ के लिए, /** */ का इस्तेमाल करें. इन्हें लागू किया जा सकता है का इस्तेमाल सिर्फ़ टाइप, तरीके, फ़ील्ड, और ईनम वैल्यू की जानकारी के लिए किया जा सकता है. उदाहरणः
    /** Replied status */
    enum TeleportStatus {
        /** Object entirely teleported. */
        OK              = 0,
        /** Methods return this if teleportation is not completed. */
        ERROR_TELEPORT  = 1,
        /**
         * Teleportation could not be completed due to an object
         * obstructing the path.
         */
        ERROR_OBJECT    = 2,
        ...
    }
    
    अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है
  • एक से ज़्यादा लाइन में टिप्पणी करने की सुविधा चालू करें. इसके लिए, /** का इस्तेमाल किसी अलग लाइन में करें. हर लाइन की शुरुआत में * इस्तेमाल करें. स्टार के निशान को अलाइन करते हुए, */ लिखकर टिप्पणी खत्म करें. उदाहरणः
    /**
     * My multi-line
     * comment
     */
    
    अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है
  • लाइसेंस की सूचना और बदलावों का लॉग, /* के साथ नई लाइन शुरू होना चाहिए (एक तारे का निशान), हर लाइन की शुरुआत में * का इस्तेमाल करें, और */ आखिरी लाइन पर है (तारे का निशान अलाइन होना चाहिए). उदाहरणः
    /*
     * Copyright (C) 2017 The Android Open Source Project
     * ...
     */
    
    /*
     * Changelog:
     * ...
     */
    
    अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है

फ़ाइल पर की गई टिप्पणियां

हर फ़ाइल को लाइसेंस की सूचना के साथ शुरू करें. कोर एचएएल के लिए, यह यह AOSP Apache लाइसेंस होना चाहिए development/docs/copyright-templates/c.txt. साल को अपडेट करना और /* */ स्टाइल वाली एक से ज़्यादा लाइन वाली टिप्पणियां इस्तेमाल करना न भूलें जैसा कि ऊपर बताया गया है.

लाइसेंस की सूचना मिलने के बाद, उसके बाद एक खाली लाइन भी डाली जा सकती है. हालांकि, ऐसा करना ज़रूरी नहीं है बदलाव लॉग/वर्शन जानकारी के हिसाब से बनाया जा सकता है. /* */ स्टाइल इस्तेमाल करें बहु-पंक्ति टिप्पणियां, जैसा कि ऊपर बताया गया है, रिक्त पंक्ति चेंजलॉग का इस्तेमाल करें, फिर पैकेज के बारे में एलान के साथ फ़ॉलो करें.

TODO की टिप्पणियां

TODO में सभी बड़े अक्षरों में TODO स्ट्रिंग होनी चाहिए और उसके बाद एक कोलन. उदाहरण:

// TODO: remove this code before foo is checked in.

TODO की टिप्पणियों की अनुमति सिर्फ़ डेवलपमेंट के दौरान दी जाती है; उन्हें ऐसा करना चाहिए पब्लिश किए गए इंटरफ़ेस में मौजूद नहीं है.

इंटरफ़ेस और फ़ंक्शन टिप्पणियां (docstrings)

एक से ज़्यादा लाइन और एक लाइन वाली डॉकस्ट्रिंग के लिए, /** */ का इस्तेमाल करें. इस्तेमाल न करें docstrings के लिए //.

इंटरफ़ेस के लिए डॉकस्ट्रिंग को इंटरफ़ेस, डिज़ाइन की वजह, मकसद वगैरह. फ़ंक्शन के लिए डॉकस्ट्रिंग फ़ंक्शन के लिए खास (पैकेज-लेवल का दस्तावेज़, README फ़ाइल में जाता है (पैकेज डायरेक्ट्री).

/**
 * IFooController is the controller for foos.
 */
interface IFooController {
    /**
     * Opens the controller.
     *
     * @return status HAL_FOO_OK if successful.
     */
    open() generates (FooStatus status);

    /** Close the controller. */
    close();
};

आपको हर एक के लिए @param और @return जोड़ने होंगे पैरामीटर/रिटर्न वैल्यू:

  • हर पैरामीटर के लिए, @param जोड़ना ज़रूरी है. यह ऐसा होना चाहिए इसके बाद पैरामीटर का नाम और फिर docstring.
  • हर रिटर्न वैल्यू के लिए @return को जोड़ना ज़रूरी है. यह पहले रिटर्न वैल्यू और फिर docstring का नाम होना चाहिए.

उदाहरण:

/**
 * Explain what foo does.
 *
 * @param arg1 explain what arg1 is
 * @param arg2 explain what arg2 is
 * @return ret1 explain what ret1 is
 * @return ret2 explain what ret2 is
 */
foo(T arg1, T arg2) generates (S ret1, S ret2);

फ़ॉर्मैटिंग के नियम

फ़ॉर्मैटिंग के सामान्य नियमों में ये शामिल हैं:

  • लाइन की लंबाई. टेक्स्ट की हर लाइन ज़्यादा से ज़्यादा इतनी होनी चाहिए 100 कॉलम लंबा.
  • व्हाइटस्पेस. लाइनों के पीछे कोई खाली सफ़ेद जगह नहीं होनी चाहिए; खाली लाइनें खाली सफ़ेद जगह नहीं होनी चाहिए.
  • स्पेस और टैब. सिर्फ़ स्पेस का इस्तेमाल करें.
  • इंडेंट का साइज़. ब्लॉक के लिए 4 स्पेस का इस्तेमाल करें और लाइन रैप के लिए 8 स्पेस
  • ब्रेसिंग. एनोटेशन को छोड़कर वैल्यू हो, तो ओपन ब्रैकेट उसी लाइन पर होता है जिस लाइन में पिछली बार लगाया गया था कोड है, लेकिन close ब्रेस और नीचे दिया गया सेमीकोलन लगेगा पूरी लाइन में से एक है. उदाहरणः
    interface INfc {
        close();
    };
    
    अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है

पैकेज की जानकारी

लाइसेंस के बाद, फ़ाइल में सबसे ऊपर पैकेज का एलान होना चाहिए सूचना को पूरी लाइन में दिखाया जाना चाहिए और उसे इंडेंट नहीं किया जाना चाहिए. पैकेज हैं निम्न प्रारूप का उपयोग करके घोषित किया गया है (नाम प्रारूपण के लिए, देखें पैकेज के नाम):

package PACKAGE-NAME;

उदाहरण:

package android.hardware.nfc@1.0;

फ़ंक्शन का एलान

फ़ंक्शन का नाम, पैरामीटर, generates, और रिटर्न वैल्यू यदि वे फ़िट होते हैं, तो उन्हें उसी पंक्ति में रखा जाना चाहिए. उदाहरण:

interface IFoo {
    /** ... */
    easyMethod(int32_t data) generates (int32_t result);
};

यदि वे एक ही पंक्ति में फ़िट नहीं होते हैं, तो पैरामीटर रखने और वापस लौटने की कोशिश करें वैल्यू को एक ही इंडेंट लेवल में सेट करें और generate में अंतर करें रीडर तेज़ी से पैरामीटर देख लेता है और वैल्यू दिखाता है. उदाहरण:

interface IFoo {
    suchALongMethodThatCannotFitInOneLine(int32_t theFirstVeryLongParameter,
                                          int32_t anotherVeryLongParameter);
    anEvenLongerMethodThatCannotFitInOneLine(int32_t theFirstLongParameter,
                                             int32_t anotherVeryLongParameter)
                                  generates (int32_t theFirstReturnValue,
                                             int32_t anotherReturnValue);
    superSuperSuperSuperSuperSuperSuperLongMethodThatYouWillHateToType(
            int32_t theFirstVeryLongParameter, // 8 spaces
            int32_t anotherVeryLongParameter
        ) generates (
            int32_t theFirstReturnValue,
            int32_t anotherReturnValue
        );
    /* method name is even shorter than 'generates' */
    foobar(AReallyReallyLongType aReallyReallyLongParameter,
           AReallyReallyLongType anotherReallyReallyLongParameter)
        generates (ASuperLongType aSuperLongReturnValue, // 4 spaces
                   ASuperLongType anotherSuperLongReturnValue);
}

अतिरिक्त विवरण:

  • खुला कोष्ठक हमेशा उसी लाइन पर होता है जिस पर फ़ंक्शन का नाम होता है.
  • फ़ंक्शन के नाम और खुले कोष्ठक के बीच कोई खाली जगह नहीं है.
  • ब्रैकेट और पैरामीटर के बीच कोई खाली जगह सिवाए न हो उनके बीच के लाइन फ़ीड हैं.
  • अगर generates उसी लाइन पर है जहां पिछले क्लोज़िंग पॉइंट मौजूद थे पहले वाले स्पेस का इस्तेमाल करें. अगर generates समान हो पंक्ति को अगले खुले कोष्ठक के रूप में लिखें, उसके बाद एक रिक्ति होनी चाहिए.
  • अगर हो सके, तो सभी पैरामीटर को अलाइन करें और वैल्यू दिखाएं.
  • डिफ़ॉल्ट इंडेंटेशन में चार स्पेस होते हैं.
  • रैप किए गए पैरामीटर, पिछली लाइन के पहले पैरामीटर के साथ अलाइन होते हैं, नहीं तो उनमें 8-स्पेस का इंडेंट होता है.

एनोटेशन

टिप्पणियों के लिए नीचे दिए गए फ़ॉर्मैट का इस्तेमाल करें:

@annotate(keyword = value, keyword = {value, value, value})

एनोटेशन को वर्णमाला के क्रम में लगाएं और बराबर चिह्नों के आस-पास स्पेस इस्तेमाल करें. उदाहरण:

@callflow(key = value)
@entry
@exit

पक्का करें कि कोई एनोटेशन पूरी लाइन में हो. उदाहरण:

/* Good */
@entry
@exit

/* Bad */
@entry @exit

अगर एनोटेशन एक ही लाइन में फ़िट नहीं हो पाते, तो आठ स्पेस के साथ इंडेंट करें. उदाहरण:

@annotate(
        keyword = value,
        keyword = {
                value,
                value
        },
        keyword = value)

अगर वैल्यू का पूरा कलेक्शन एक ही लाइन में फ़िट नहीं हो सकता, तो इसके बाद लाइन ब्रेक डालें { और अरे के अंदर हर कॉमा के बाद, ब्रैकेट खोलें. जगह को बंद किया जा रहा है अंतिम मान के ठीक बाद कोष्ठक. अगर ब्रेसेस नहीं हैं, तो का इस्तेमाल करें.

अगर वैल्यू का पूरा अरे एक ही लाइन में फ़िट हो सकता है, तो इसके बाद स्पेस का इस्तेमाल न करें और सही ब्रैकेट. खोलने के लिए अतिरिक्त ब्रैकेट इस्तेमाल करें. साथ ही, हर कॉमा के बाद एक स्पेस इस्तेमाल करें. उदाहरण:

/* Good */
@callflow(key = {"val", "val"})

/* Bad */
@callflow(key = { "val","val" })

एनोटेशन और फ़ंक्शन के बीच खाली लाइन नहीं होनी चाहिए एलान के लिए उपलब्ध है. उदाहरण:

/* Good */
@entry
foo();

/* Bad */
@entry

foo();

Enum एलान

ईनम की जानकारी के लिए इन नियमों का इस्तेमाल करें:

  • अगर ईनम एलान को किसी दूसरे पैकेज के साथ शेयर किया गया है, तो एलानों को रखें किसी इंटरफ़ेस में एम्बेड करने के बजाय types.hal में.
  • कोलन से पहले और बाद में स्पेस का इस्तेमाल करें. साथ ही, दिए गए टाइप के बाद स्पेस का इस्तेमाल करें पहले से ज़्यादा शानदार हो सकते हैं.
  • हो सकता है कि आखिरी enum वैल्यू में एक और कॉमा न हो.

ज़रूरी शर्तें पूरी करने की जानकारी देने वाले एलान

स्ट्रक्चर की जानकारी देने के लिए, इन नियमों का इस्तेमाल करें:

  • अगर स्ट्रक्चर के एलान को किसी दूसरे पैकेज के साथ शेयर किया गया है, तो एलानों को रखें किसी इंटरफ़ेस में एम्बेड करने के बजाय types.hal में.
  • ओपन ब्रैकेट से पहले, स्ट्रक्चर टाइप के नाम के बाद स्पेस का इस्तेमाल करें.
  • फ़ील्ड के नामों को अलाइन करें (ज़रूरी नहीं). उदाहरणः
    struct MyStruct {
        vec<uint8_t>   data;
        int32_t        someInt;
    }
    
    अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है

कलेक्शन की जानकारी

इनके बीच स्पेस न डालें:

  • एलिमेंट का टाइप और खुला स्क्वेयर ब्रैकेट.
  • वर्ग ब्रैकेट और अरे का साइज़ खोलें.
  • अरे का साइज़ और क्लोज़ स्क्वेयर ब्रैकेट.
  • एक से ज़्यादा होने पर, वर्गाकार ब्रैकेट और अगला खुला वर्ग ब्रैकेट बंद करें डाइमेंशन मौजूद है.

उदाहरण:

/* Good */
int32_t[5] array;

/* Good */
int32_t[5][6] multiDimArray;

/* Bad */
int32_t [ 5 ] [ 6 ] array;

वेक्टर

इनके बीच स्पेस न डालें:

  • vec और ओपन ऐंगल ब्रैकेट.
  • ओपन ऐंगल ब्रैकेट और एलिमेंट टाइप (अपवाद: एलिमेंट का टाइप भी vec).
  • एलिमेंट का टाइप और क्लोज़ ऐंगल ब्रैकेट (अपवाद: एलिमेंट का टाइप भी vec).

उदाहरण:

/* Good */
vec<int32_t> array;

/* Good */
vec<vec<int32_t>> array;

/* Good */
vec< vec<int32_t> > array;

/* Bad */
vec < int32_t > array;

/* Bad */
vec < vec < int32_t > > array;