Navnerum i aRts

Indledning

Hver navnerumsdeklaration hører sammen med en deklaration af en “modul” i MCOP IDL.

// mcop idl

module M {
    interface A
    {
    }
};

interface B;

I dette tilfælde ville den genererede C++ kode for IDL-fragmentet se sådan her ud:

// C++ deklaration

namespace M {
    /* deklaration af A_base/A_skel/A_stub og lignende */
    class A {        // Smartwrap referenceklasse
        /* [...] */
    };
}

/* deklaration af B_base/B_skel/B_stub og lignende */
class B {
    /* [...] */
};

Så når du henviser til klasserne fra eksemplet ovenfor i din C++ kode, skal du skrive M::A, men kun B. Du kan imidlertid bruge “using M” et sted, som med alle navnerum i C++.

Hvordan aRts bruger navnerum

Der er et globalt navnerum som kaldes “Arts”, som alle programmer og biblioteker som hører til aRts selv bruger til at lægge deres deklarationer i. Dette betyder at når du skriver C++ kode som afhænger af aRts, skal du normalt bruge præfikset Arts:: for hver klasse du bruger, sådan her:

int main(int argc, char **argv)
{
    Arts::Dispatcher dispatcher;
    Arts::SimpleSoundServer server(Arts::Reference("global:Arts_SimpleSoundServer"));

    server.play("/var/foo/nogen_fil.wav");

Det andet alternativ er at skrive "using" en gang, sådan her:

using namespace Arts;

int main(int argc, char **argv)
{
    Dispatcher dispatcher;
    SimpleSoundServer server(Reference("global:Arts_SimpleSoundServer"));

    server.play("/var/foo/nogen_fil.wav");
    [...]

I IDL-filer, har du egentlig ikke noget valg. Hvis du skriver kode som tilhører aRts selv, skal du putte den i modulet aRts.

// IDL-fil for aRts-kode:
#include <artsflow.idl>
module Arts {        // put den i Arts-navnerum
    interface Synth_TWEAK : SynthModule
    {
        in audio stream invalue;
        out audio stream outvalue;
        attribute float tweakFactor;
    };
};

Hvis du skriver kode som ikke hører til selve aRts, skal du ikke putte den i navnerummet “Arts”. Du kan dog oprette et eget navnerum hvis du vil. Under alle omstændigheder, skal du bruge præfiks for klasser fra aRts som du bruger.

// IDL-fil for kode som ikke hører til aRts:
#include <artsflow.idl>

// skriv enten med eller uden moduldeklaration, og de genererede klasser
// kommer ikke til at bruge et navnerum:
interface Synth_TWEAK2 : Arts::SynthModule
{
    in audio stream invalue;
    out audio stream outvalue;
    attribute float tweakFactor;
};

// du kan dog vælge et eget navnerum hvis du vil, så hvis du
// skriver programmet "PowerRadio", ville du kunne gøre sådan her:
module PowerRadio {
    struct Station {
        string name;
        float frequency;
    };

    interface Tuner : Arts::SynthModule {
        attribute Station station;     // intet præfiks for Station, samme modul
        out audio stream left, right;
    };
};

Interne funktioner: hvordan implementeringen virker

MCOP har ofte brug for at henvise til navne på typer og grænseflader for typekonverteringer, grænseflader og metodesignaturer. Disse repræsenteres af strenge i de almindelige MCOP-datastrukturer, mens navnerummet altid er fuldstændigt repræsenteret i C++ stilen. Dette betyder at strengene skal indeholde “M::A” og “B”, ifølge eksemplerne ovenfor.

Bemærk at dette til og med gælder hvis navnerumskvalifikatorerne ikke blev givet inde i IDL-teksten, eftersom sammenhængen klargør hvilket navnerum grænsefladen A var beregnet til at bruge.