/*
*******************************************************************************
*
*   Copyright (C) 2003, International Business Machines
*   Corporation and others.  All Rights Reserved.
*
*******************************************************************************
*
* File line.h
*
* Modification History:
*
*   Date        Name        Description
*   03/18/2003  weiv        Creation.
*******************************************************************************
*/

//
//   class Line
//
//      Each line from the source file (containing a name, presumably) gets
//      one of these structs.
//

#ifndef COLPROBE_LINE_H
#define COLPROBE_LINE_H
#include "unicode/utypes.h"
#include "unicode/ucol.h"
#include "unicode/ustring.h"
#include "unicode/unistr.h"
#include "unicode/uchar.h"
#include "unicode/uniset.h"
#include "colprobe.h"

#include <stdlib.h>
#include <string.h>

static const int MAX_EXPANSION_PREFIXES = 10;

class  Line {
public:
  static void copyArray(Line *dest, const Line *src, int32_t size);
  Line();
  Line(const Line &other);
  Line(const UChar* name, int32_t len);
  Line(const UnicodeString &string);
  Line(const UChar name);
  Line(const char *buff, int32_t buffLen, UErrorCode &status);
  ~Line();
  Line & operator=(const Line &other);
  UBool operator==(const Line &other) const;
  UBool operator!=(const Line &other) const;
  void setToConcat(const Line *first, const Line *second);
  void setName(const UChar* name, int32_t len);
  UnicodeString toString(UBool pretty = FALSE);
  UnicodeString toBundleString();
  UnicodeString toHTMLString();
  int32_t write(char *buff, int32_t buffLen, UErrorCode &status);
  void initFromString(const char *buff, int32_t buffLen, UErrorCode &status);
  

  UnicodeString strengthIndent(UColAttributeValue strength, int indentSize, UnicodeString &result);
  UnicodeString strengthToString(UColAttributeValue strength, UBool pretty, UBool html = FALSE);
  UnicodeString stringToName(UChar *string, int32_t len);
  void setTo(const UnicodeString &string);
  void setTo(const UChar32 n);
  UBool equals(const Line &other) const;
  Line *nextInteresting();
  void append(const UChar n);
  void append(const UChar* n, int32_t length);
  void append(const Line &l);
  void clear();
  void swapCase();
  void swapCase(UChar *string, int32_t &sLen);
  UnicodeString dumpSortkey();
  void init();

  
public:
    UChar     name[25];
    int32_t   len;
    UChar     expansionString[25];
    int32_t   expLen;

    UColAttributeValue strength;
    UColAttributeValue strengthFromEmpty;
    UColAttributeValue cumulativeStrength;
    UColAttributeValue expStrength;

    Line *previous;
    Line *next;

    // In case this element is a contraction
    // we keep a pointer at which lines were components
    Line *left;
    Line *right;

    UBool   isContraction;
    UBool   isExpansion;
    UBool   isRemoved;
    UBool   isReset;

    int32_t expIndex;
    uint8_t firstCC;
    uint8_t lastCC;

    uint8_t   *sortKey;
public:
  static UnicodeSet *needsQuoting;
};


#endif //COLPROBE_LINE_H
