// @(#)root/tree:$Id$
// Author: Rene Brun   14/04/97

/*************************************************************************
 * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TCut                                                                 //
//                                                                      //
//  A specialized string object used for TTree selections.              //
//  A TCut object has a name and a title. It does not add any data      //
//  members compared to a TNamed. It only add a set of operators to     //
//  facilitate logical string concatenation. For example, assume        //
//     cut1 = "x<1"  and cut2 = "y>2"                                   //
//  then                                                                //
//     cut1 && cut2 will be the string "(x<1)&&(y>2)"                   //
//                                                                      //
//  Operators =, +=, +, *, !, &&, || overloaded.                        //
//                                                                      //
//   Examples of use:                                                   //
//     Root > TCut c1 = "x<1"                                           //
//     Root > TCut c2 = "y<0"                                           //
//     Root > TCut c3 = c1&&c2                                          //
//     Root > ntuple.Draw("x", c1)                                      //
//     Root > ntuple.Draw("x", c1||"x>0")                               //
//     Root > ntuple.Draw("x", c1&&c2)                                  //
//     Root > ntuple.Draw("x", "(x+y)"*(c1&&c2))                        //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#include "TCut.h"

ClassImp(TCut)

//______________________________________________________________________________
TCut::TCut() : TNamed()
{
   // Constructor.
}

//______________________________________________________________________________
TCut::TCut(const char *title) : TNamed("CUT",title)
{
   // Constructor.
}

//______________________________________________________________________________
TCut::TCut(const char *name, const char *title) : TNamed(name,title)
{
   // Constructor.
}

//______________________________________________________________________________
TCut::TCut(const TCut &cut) : TNamed(cut)
{
   // Copy Constructor.
}

//______________________________________________________________________________
TCut::~TCut()
{
   // Typical destructor.
}

//______________________________________________________________________________
Bool_t TCut::operator==(const char *rhs) const
{
   // Comparison.

   return fTitle == rhs;
}

//______________________________________________________________________________
Bool_t TCut::operator==(const TCut &rhs) const
{
   // Comparison.

   return fTitle == rhs.fTitle;
}

//______________________________________________________________________________
Bool_t TCut::operator!=(const char *rhs) const
{
   // Comparison.

   return fTitle != rhs;
}

//______________________________________________________________________________
Bool_t TCut::operator!=(const TCut &rhs) const
{
   // Comparison.

   return fTitle != rhs.fTitle;
}

//______________________________________________________________________________
TCut& TCut::operator=(const char *rhs)
{
   // Assignment.

   fTitle = rhs;
   return *this;
}

//______________________________________________________________________________
TCut& TCut::operator=(const TCut& rhs)
{
   // Assignment.

   if (this != &rhs) TNamed::operator=(rhs);
   return *this;
}

//______________________________________________________________________________
TCut& TCut::operator+=(const char *rhs)
{
   // Addition.

   if (!rhs || !rhs[0]) return *this;
   if (fTitle.Length() == 0)
      fTitle = rhs;
   else
      fTitle = "(" + fTitle + ")&&(" + TString(rhs) + ")";
   return *this;
}

//______________________________________________________________________________
TCut& TCut::operator+=(const TCut& rhs)
{
   // Addition.

   if (rhs.fTitle.Length() == 0) return *this;
   if (fTitle.Length() == 0)
      fTitle = rhs;
   else
      fTitle = "(" + fTitle + ")&&(" + rhs.fTitle + ")";
   return *this;
}

//______________________________________________________________________________
TCut& TCut::operator*=(const char *rhs)
{
   // Multiplication.

if (!rhs || !rhs[0]) return *this;
   if (fTitle.Length() == 0)
      fTitle = rhs;
   else
      fTitle = "(" + fTitle + ")*(" + TString(rhs) + ")";
   return *this;
}

//______________________________________________________________________________
TCut& TCut::operator*=(const TCut& rhs)
{
   // Multiplication.

   if (rhs.fTitle.Length() == 0) return *this;
   if (fTitle.Length() == 0)
      fTitle = rhs;
   else
      fTitle = "(" + fTitle + ")*(" + rhs.fTitle + ")";
   return *this;
}

//______________________________________________________________________________
TCut operator+(const TCut& lhs, const char *rhs)
{
   // Addition.

   return TCut(lhs) += rhs;
}

//______________________________________________________________________________
TCut operator+(const char *lhs, const TCut& rhs)
{
   // Addition.

   return TCut(lhs) += rhs;
}

//______________________________________________________________________________
TCut operator+(const TCut& lhs, const TCut& rhs)
{
   // Addition.

   return TCut(lhs) += rhs;
}

//______________________________________________________________________________
TCut operator*(const TCut& lhs, const char *rhs)
{
   // Multiplication.

   return TCut(lhs) *= rhs;
}

//______________________________________________________________________________
TCut operator*(const char *lhs, const TCut& rhs)
{
   // Multiplication.

   return TCut(lhs) *= rhs;
}

//______________________________________________________________________________
TCut operator*(const TCut& lhs, const TCut& rhs)
{
   // Multiplication.

   return TCut(lhs) *= rhs;
}

//______________________________________________________________________________
TCut operator&&(const TCut& lhs, const char *rhs)
{
   // Logical and.

   return TCut(lhs) += rhs;
}

//______________________________________________________________________________
TCut operator&&(const char *lhs, const TCut& rhs)
{
   // Logical and.

   return TCut(lhs) += rhs;
}

//______________________________________________________________________________
TCut operator&&(const TCut& lhs, const TCut& rhs)
{
   // Logical and.

   return TCut(lhs) += rhs;
}

//______________________________________________________________________________
TCut operator||(const TCut& lhs, const char *rhs)
{
   // Logical or.

   if (lhs.fTitle.Length() == 0 && (!rhs || !rhs[0])) return TCut();
   if (lhs.fTitle.Length() == 0) return TCut(rhs);
   if (!rhs || !rhs[0]) return TCut(lhs);
   TString s = "(" + lhs.fTitle + ")||(" + TString(rhs) + ")";
   return TCut(s.Data());
}

//______________________________________________________________________________
TCut operator||(const char *lhs, const TCut& rhs)
{
   // Logical or.

   if ((!lhs || !lhs[0]) && rhs.fTitle.Length() == 0) return TCut();
   if (!lhs || !lhs[0]) return TCut(rhs);
   if (rhs.fTitle.Length() == 0) return TCut(lhs);
   TString s = "(" + TString(lhs) + ")||(" + rhs.fTitle + ")";
   return TCut(s.Data());
}

//______________________________________________________________________________
TCut operator||(const TCut& lhs, const TCut& rhs)
{
   // Logical or.

   if (lhs.fTitle.Length() == 0 && rhs.fTitle.Length() == 0) return TCut();
   if (lhs.fTitle.Length() == 0) return TCut(rhs);
   if (rhs.fTitle.Length() == 0) return TCut(lhs);
   TString s = "(" + lhs.fTitle + ")||(" + rhs.fTitle + ")";
   return TCut(s.Data());
}

//______________________________________________________________________________
TCut operator!(const TCut &rhs)
{
   // Logical negation.

   if (rhs.fTitle.Length() == 0) return TCut();
   TString s = "!(" + rhs.fTitle + ")";
   return TCut(s.Data());
}

 TCut.cxx:1
 TCut.cxx:2
 TCut.cxx:3
 TCut.cxx:4
 TCut.cxx:5
 TCut.cxx:6
 TCut.cxx:7
 TCut.cxx:8
 TCut.cxx:9
 TCut.cxx:10
 TCut.cxx:11
 TCut.cxx:12
 TCut.cxx:13
 TCut.cxx:14
 TCut.cxx:15
 TCut.cxx:16
 TCut.cxx:17
 TCut.cxx:18
 TCut.cxx:19
 TCut.cxx:20
 TCut.cxx:21
 TCut.cxx:22
 TCut.cxx:23
 TCut.cxx:24
 TCut.cxx:25
 TCut.cxx:26
 TCut.cxx:27
 TCut.cxx:28
 TCut.cxx:29
 TCut.cxx:30
 TCut.cxx:31
 TCut.cxx:32
 TCut.cxx:33
 TCut.cxx:34
 TCut.cxx:35
 TCut.cxx:36
 TCut.cxx:37
 TCut.cxx:38
 TCut.cxx:39
 TCut.cxx:40
 TCut.cxx:41
 TCut.cxx:42
 TCut.cxx:43
 TCut.cxx:44
 TCut.cxx:45
 TCut.cxx:46
 TCut.cxx:47
 TCut.cxx:48
 TCut.cxx:49
 TCut.cxx:50
 TCut.cxx:51
 TCut.cxx:52
 TCut.cxx:53
 TCut.cxx:54
 TCut.cxx:55
 TCut.cxx:56
 TCut.cxx:57
 TCut.cxx:58
 TCut.cxx:59
 TCut.cxx:60
 TCut.cxx:61
 TCut.cxx:62
 TCut.cxx:63
 TCut.cxx:64
 TCut.cxx:65
 TCut.cxx:66
 TCut.cxx:67
 TCut.cxx:68
 TCut.cxx:69
 TCut.cxx:70
 TCut.cxx:71
 TCut.cxx:72
 TCut.cxx:73
 TCut.cxx:74
 TCut.cxx:75
 TCut.cxx:76
 TCut.cxx:77
 TCut.cxx:78
 TCut.cxx:79
 TCut.cxx:80
 TCut.cxx:81
 TCut.cxx:82
 TCut.cxx:83
 TCut.cxx:84
 TCut.cxx:85
 TCut.cxx:86
 TCut.cxx:87
 TCut.cxx:88
 TCut.cxx:89
 TCut.cxx:90
 TCut.cxx:91
 TCut.cxx:92
 TCut.cxx:93
 TCut.cxx:94
 TCut.cxx:95
 TCut.cxx:96
 TCut.cxx:97
 TCut.cxx:98
 TCut.cxx:99
 TCut.cxx:100
 TCut.cxx:101
 TCut.cxx:102
 TCut.cxx:103
 TCut.cxx:104
 TCut.cxx:105
 TCut.cxx:106
 TCut.cxx:107
 TCut.cxx:108
 TCut.cxx:109
 TCut.cxx:110
 TCut.cxx:111
 TCut.cxx:112
 TCut.cxx:113
 TCut.cxx:114
 TCut.cxx:115
 TCut.cxx:116
 TCut.cxx:117
 TCut.cxx:118
 TCut.cxx:119
 TCut.cxx:120
 TCut.cxx:121
 TCut.cxx:122
 TCut.cxx:123
 TCut.cxx:124
 TCut.cxx:125
 TCut.cxx:126
 TCut.cxx:127
 TCut.cxx:128
 TCut.cxx:129
 TCut.cxx:130
 TCut.cxx:131
 TCut.cxx:132
 TCut.cxx:133
 TCut.cxx:134
 TCut.cxx:135
 TCut.cxx:136
 TCut.cxx:137
 TCut.cxx:138
 TCut.cxx:139
 TCut.cxx:140
 TCut.cxx:141
 TCut.cxx:142
 TCut.cxx:143
 TCut.cxx:144
 TCut.cxx:145
 TCut.cxx:146
 TCut.cxx:147
 TCut.cxx:148
 TCut.cxx:149
 TCut.cxx:150
 TCut.cxx:151
 TCut.cxx:152
 TCut.cxx:153
 TCut.cxx:154
 TCut.cxx:155
 TCut.cxx:156
 TCut.cxx:157
 TCut.cxx:158
 TCut.cxx:159
 TCut.cxx:160
 TCut.cxx:161
 TCut.cxx:162
 TCut.cxx:163
 TCut.cxx:164
 TCut.cxx:165
 TCut.cxx:166
 TCut.cxx:167
 TCut.cxx:168
 TCut.cxx:169
 TCut.cxx:170
 TCut.cxx:171
 TCut.cxx:172
 TCut.cxx:173
 TCut.cxx:174
 TCut.cxx:175
 TCut.cxx:176
 TCut.cxx:177
 TCut.cxx:178
 TCut.cxx:179
 TCut.cxx:180
 TCut.cxx:181
 TCut.cxx:182
 TCut.cxx:183
 TCut.cxx:184
 TCut.cxx:185
 TCut.cxx:186
 TCut.cxx:187
 TCut.cxx:188
 TCut.cxx:189
 TCut.cxx:190
 TCut.cxx:191
 TCut.cxx:192
 TCut.cxx:193
 TCut.cxx:194
 TCut.cxx:195
 TCut.cxx:196
 TCut.cxx:197
 TCut.cxx:198
 TCut.cxx:199
 TCut.cxx:200
 TCut.cxx:201
 TCut.cxx:202
 TCut.cxx:203
 TCut.cxx:204
 TCut.cxx:205
 TCut.cxx:206
 TCut.cxx:207
 TCut.cxx:208
 TCut.cxx:209
 TCut.cxx:210
 TCut.cxx:211
 TCut.cxx:212
 TCut.cxx:213
 TCut.cxx:214
 TCut.cxx:215
 TCut.cxx:216
 TCut.cxx:217
 TCut.cxx:218
 TCut.cxx:219
 TCut.cxx:220
 TCut.cxx:221
 TCut.cxx:222
 TCut.cxx:223
 TCut.cxx:224
 TCut.cxx:225
 TCut.cxx:226
 TCut.cxx:227
 TCut.cxx:228
 TCut.cxx:229
 TCut.cxx:230
 TCut.cxx:231
 TCut.cxx:232
 TCut.cxx:233
 TCut.cxx:234
 TCut.cxx:235
 TCut.cxx:236
 TCut.cxx:237
 TCut.cxx:238
 TCut.cxx:239
 TCut.cxx:240
 TCut.cxx:241
 TCut.cxx:242
 TCut.cxx:243
 TCut.cxx:244
 TCut.cxx:245
 TCut.cxx:246
 TCut.cxx:247
 TCut.cxx:248
 TCut.cxx:249
 TCut.cxx:250
 TCut.cxx:251
 TCut.cxx:252
 TCut.cxx:253
 TCut.cxx:254
 TCut.cxx:255
 TCut.cxx:256
 TCut.cxx:257
 TCut.cxx:258
 TCut.cxx:259
 TCut.cxx:260
 TCut.cxx:261
 TCut.cxx:262
 TCut.cxx:263
 TCut.cxx:264
 TCut.cxx:265
 TCut.cxx:266
 TCut.cxx:267
 TCut.cxx:268
 TCut.cxx:269
 TCut.cxx:270
 TCut.cxx:271
 TCut.cxx:272
 TCut.cxx:273
 TCut.cxx:274
 TCut.cxx:275
 TCut.cxx:276
 TCut.cxx:277
 TCut.cxx:278
 TCut.cxx:279
 TCut.cxx:280
 TCut.cxx:281
 TCut.cxx:282
 TCut.cxx:283
 TCut.cxx:284
 TCut.cxx:285
 TCut.cxx:286
 TCut.cxx:287
 TCut.cxx:288
 TCut.cxx:289
 TCut.cxx:290