bottleimpl.h

来自「一个语言识别引擎」· C头文件 代码 · 共 397 行

H
397
字号
// -*- mode:C++; tab-width:4; c-basic-offset:4; indent-tabs-mode:nil -*-

/*
 * Copyright (C) 2006 Paul Fitzpatrick
 * CopyPolicy: Released under the terms of the GNU GPL v2.0.
 *
 */

#ifndef _YARP2_BOTTLEIMPL_
#define _YARP2_BOTTLEIMPL_

#include <yarp/String.h>
#include <yarp/ManagedBytes.h>
#include <yarp/os/ConnectionReader.h>
#include <yarp/os/ConnectionWriter.h>
#include <yarp/os/Portable.h>
#include <yarp/os/Vocab.h>

#include <ace/Vector_T.h>

#include <yarp/os/Bottle.h>
#include <yarp/Logger.h>

namespace yarp {
    class BottleImpl;
    class Storable;
    class StoreNull;
    class StoreInt;
    class StoreVocab;
    class StoreDouble;
    class StoreString;
    class StoreBlob;
    class StoreList;
}


class yarp::Storable : public yarp::os::Value {
public:
    virtual bool isInt() const     { return false; }
    virtual bool isString() const { return false; }
    virtual bool isDouble() const  { return false; }
    virtual bool isList() const    { return false; }
    virtual bool isVocab() const   { return false; }
    virtual bool isBlob() const    { return false; }

    virtual int asInt() const            { return 0; }
    virtual int asVocab() const          { return 0; }
    virtual double asDouble() const      { return 0; }
    virtual yarp::os::ConstString asString() const { 
        return yarp::os::ConstString(asStringFlex().c_str()); 
    }
    virtual yarp::os::Bottle *asList() const { return NULL; }
    virtual const char *asBlob() const   { return (const char*)0; }
    virtual int asBlobLength() const     { return 0; }

    virtual bool read(ConnectionReader& connection) = 0;
    virtual bool write(ConnectionWriter& connection) = 0;

    virtual bool check(const char *key);

    virtual yarp::os::Value& find(const char *key);
    virtual yarp::os::Bottle& findGroup(const char *key);

    virtual bool operator == (const yarp::os::Value& alt) const;

    virtual yarp::os::Value *create() const { return createStorable(); }

    virtual yarp::os::Value *clone() const {
        return cloneStorable();
    }


    virtual ~Storable() {}

    virtual void fromString(const String& src) = 0;
    virtual void fromStringNested(const String& src) {
        fromString(src);
    }

    virtual yarp::os::ConstString toString() const {
        return yarp::os::ConstString(toStringFlex().c_str());
    }

    virtual String toStringFlex() const = 0;
    virtual String toStringNested() const { return toStringFlex(); }

    //virtual int getCode() = 0;
    virtual Storable *createStorable() const = 0;

    virtual String asStringFlex() const { return ""; }

    virtual Storable *cloneStorable() const {
        Storable *item = createStorable();
        YARP_ASSERT(item!=NULL);
        item->copy(*this);
        return item;
    }

    virtual void copy(const Storable& alt) {
        fromString(alt.toStringFlex());  
        // general, if inefficient, copy method
        // ideally would have special cases in subclasses
    }

    virtual int subCode() const {
        return 0;
    }


};


class yarp::StoreNull : public Storable {
public:
    StoreNull() { }
    virtual yarp::os::ConstString toString() const { return ""; }
    virtual String toStringFlex() const { return ""; }
    virtual void fromString(const String& src) {}
    virtual int getCode() const { return -1; }
    virtual bool read(ConnectionReader& connection) { return false; }
    virtual bool write(ConnectionWriter& connection) { return false; }
    virtual Storable *createStorable() const { return new StoreNull(); }
    virtual bool isNull() const { return true; }
};


class yarp::StoreInt : public Storable {
private:
    int x;
public:
    StoreInt() { x = 0; }
    StoreInt(int x) { this->x = x; }
    virtual String toStringFlex() const;
    virtual void fromString(const String& src);
    virtual int getCode() const { return code; }
    virtual bool read(ConnectionReader& connection);
    virtual bool write(ConnectionWriter& connection);
    virtual Storable *createStorable() const { return new StoreInt(0); }
    virtual int asInt() const { return x; }
    virtual int asVocab() const { return x; }
    virtual double asDouble() const { return x; }
    virtual bool isInt() const { return true; }
    static const int code;
};

class yarp::StoreVocab : public Storable {
private:
    int x;
public:
    StoreVocab() { x = 0; }
    StoreVocab(int x) { this->x = x; }
    virtual String toStringFlex() const;
    virtual void fromString(const String& src);
    virtual String toStringNested() const;
    virtual void fromStringNested(const String& src);
    virtual int getCode() const { return code; }
    virtual bool read(ConnectionReader& connection);
    virtual bool write(ConnectionWriter& connection);
    virtual Storable *createStorable() const { return new StoreVocab(0); }
    virtual int asInt() const { return x; }
    virtual int asVocab() const { return x; }
    virtual double asDouble() const { return x; }
    virtual bool isVocab() const { return true; }
    static const int code;
};

class yarp::StoreString : public Storable {
private:
    String x;
public:
    StoreString() { x = ""; }
    StoreString(const String& x) { this->x = x; }
    virtual String toStringFlex() const;
    virtual void fromString(const String& src);
    virtual String toStringNested() const;
    virtual void fromStringNested(const String& src);
    virtual int getCode() const { return code; }
    virtual bool read(ConnectionReader& connection);
    virtual bool write(ConnectionWriter& connection);
    virtual Storable *createStorable() const { 
        return new StoreString(String("")); 
    }
    virtual String asStringFlex() const { return x; }
    virtual int asVocab() const { return yarp::os::Vocab::encode(x.c_str()); }
    virtual bool isString() const { return true; }
    static const int code;
};

class yarp::StoreBlob : public Storable {
private:
    String x;
public:
    StoreBlob() { x = ""; }
    StoreBlob(const String& x) { this->x = x; }
    virtual String toStringFlex() const;
    virtual void fromString(const String& src);
    virtual String toStringNested() const;
    virtual void fromStringNested(const String& src);
    virtual int getCode() const { return code; }
    virtual bool read(ConnectionReader& connection);
    virtual bool write(ConnectionWriter& connection);
    virtual Storable *createStorable() const { 
        return new StoreBlob(String("")); 
    }
    virtual bool isBlob() const { return true; }
    virtual const char *asBlob() const         { return x.c_str(); }
    virtual int asBlobLength() const     { return x.length(); }
    static const int code;
};

class yarp::StoreDouble : public Storable {
private:
    double x;
public:
    StoreDouble() { x = 0; }
    StoreDouble(double x) { this->x = x; }
    virtual String toStringFlex() const;
    virtual void fromString(const String& src);
    virtual int getCode() const { return code; }
    virtual bool read(ConnectionReader& connection);
    virtual bool write(ConnectionWriter& connection);
    virtual Storable *createStorable() const { 
        return new StoreDouble(0); 
    }
    virtual int asInt() const { return (int)x; }
    virtual double asDouble() const { return x; }
    virtual bool isDouble() const { return true; }
    static const int code;
};


class yarp::StoreList : public Storable {
private:
    yarp::os::Bottle content;
public:
    StoreList() {}
    yarp::os::Bottle& internal() {
        return content;
    }
    virtual String toStringFlex() const;
    virtual void fromString(const String& src);
    virtual String toStringNested() const;
    virtual void fromStringNested(const String& src);
    virtual int getCode() const { return code+subCode(); }
    virtual bool read(ConnectionReader& connection);
    virtual bool write(ConnectionWriter& connection);
    virtual Storable *createStorable() const { 
        return new StoreList(); 
    }
    virtual bool isList() const { return true; }
    virtual yarp::os::Bottle *asList() const { 
        return (yarp::os::Bottle*)(&content); 
    }
    static const int code;
    virtual int subCode() const;

    virtual yarp::os::Value& find(const char *key) {
        return content.find(key);
    }

    virtual yarp::os::Bottle& findGroup(const char *key) {
        return content.findGroup(key);
    }
};



/**
 * A flexible data format for holding a bunch of numbers and strings.
 * Handy to use until you work out how to make your own more 
 * efficient formats for transmission.
 */
class yarp::BottleImpl : public yarp::os::Portable {
public:

    BottleImpl();
    virtual ~BottleImpl();


    bool isInt(int index);
    bool isString(int index);
    bool isDouble(int index);
    bool isList(int index);

    int getInt(int index);
    yarp::os::ConstString getString(int index);
    double getDouble(int index);

    Storable& get(int x) const;

    yarp::os::Bottle *getList(int index);

    void addInt(int x) {
        add(new StoreInt(x));
    }

    void addVocab(int x) {
        add(new StoreVocab(x));
    }

    void addDouble(double x) {
        add(new StoreDouble(x));
    }

    void addString(const char *text) {
        add(new StoreString(String(text)));
    }

    yarp::os::Bottle& addList();

    void clear();

    void fromString(const String& line);
    String toString();
    int size() const;

    virtual bool read(ConnectionReader& connection);
    virtual bool write(ConnectionWriter& connection);

    /*
      virtual bool write(ConnectionWriter& writer) {
      writeBlock(writer);
      return true;
      }

      virtual bool read(yarp::os::ConnectionReader& reader) {
      readBlock(reader);
      return true;
      }
    */

    const char *getBytes();
    int byteCount();

    void copyRange(const BottleImpl& alt, int first = 0, int len = -1);

    bool fromBytes(const Bytes& data);
    void toBytes(const Bytes& data);

    bool fromBytes(ConnectionReader& reader);

    void fromBinary(const char *text, int len);

    void specialize(int subCode);
    int getSpecialization();
    void setNested(bool nested);

    int subCode();

    void addBit(yarp::os::Value *bit) {
        // all Values are Storables -- important invariant!
        add((Storable*)(bit));
    }

    void addBit(const yarp::os::Value& bit) {
        // all Values are Storables -- important invariant!
        if (!bit.isNull()) {
            add((Storable*)(bit.clone()));
        }
    }

    yarp::os::Value& addBit(const char *str) {
        int len = size();
        String x(str);
        smartAdd(x);
        if (size()>len) {
            return get(size()-1);
        }
        return get(-1);
    }

    static StoreNull& getNull() {
        return storeNull;
    }

    // check if a piece of text is a completed bottle
    static bool isComplete(const char *txt);

private:
    static StoreNull storeNull;

    ACE_Vector<Storable*> content;
    ACE_Vector<char> data;
    int speciality;
    bool nested;
    bool dirty;

    void add(Storable *s);
    void smartAdd(const String& str);

    void synch();
};


#endif

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?